diff --git a/Cargo.lock b/Cargo.lock index cf4ba4404b36..e5575b5412cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2296,8 +2296,7 @@ checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "rowan" version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b574c58582fa59fa43a2feb6608b8744184659f08a2e0117e4b8224d95ed61" +source = "git+https://github.com/bit-aloo/rowan?branch=2026-09-08-more-trivia-changes#eddf3c3ff40aa2695798ebdf66c3a49b49424fcd" dependencies = [ "countme", "hashbrown 0.14.5", diff --git a/Cargo.toml b/Cargo.toml index d77e89df45e4..f68ff39a6720 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ inherits = "release" debug = 2 [patch.'crates-io'] -# rowan = { path = "../rowan" } +rowan = { git = "https://github.com/bit-aloo/rowan", branch = "2026-09-08-more-trivia-changes" } # line-index = { path = "lib/line-index" } # la-arena = { path = "lib/la-arena" } diff --git a/crates/hir-def/src/attrs/docs.rs b/crates/hir-def/src/attrs/docs.rs index 583bde92679d..9a28633ecf52 100644 --- a/crates/hir-def/src/attrs/docs.rs +++ b/crates/hir-def/src/attrs/docs.rs @@ -215,7 +215,8 @@ impl Docs { fn extend_with_doc_comment(&mut self, comment: ast::DocComment, indent: &mut Indent) { let doc = comment.text(); - let offset = comment.syntax().text_range().start() + ast::DocComment::PREFIX_LEN; + let offset = comment.syntax().text_range_without_outer_trivia().start() + + ast::DocComment::PREFIX_LEN; self.extend_with_doc_str(doc, offset, DocCommentKind::Sugared(comment.shape()), indent); } diff --git a/crates/hir-def/src/expr_store/lower.rs b/crates/hir-def/src/expr_store/lower.rs index b5d514592770..8a829293179c 100644 --- a/crates/hir-def/src/expr_store/lower.rs +++ b/crates/hir-def/src/expr_store/lower.rs @@ -3745,8 +3745,7 @@ impl<'db> ExprCollector<'db> { } fn comma_follows_token(t: Option) -> bool { - (|| syntax::algo::skip_trivia_token(t?.next_token()?, syntax::Direction::Next))() - .is_some_and(|it| it.kind() == syntax::T![,]) + t.and_then(|it| it.next_non_trivia_token()).is_some_and(|it| it.kind() == syntax::T![,]) } /// This function find the AST fragment that corresponds to an `AssociatedTypeBinding` in the HIR. diff --git a/crates/hir-def/src/expr_store/lower/asm.rs b/crates/hir-def/src/expr_store/lower/asm.rs index fb0a5b0bf7a7..735e40a1cab9 100644 --- a/crates/hir-def/src/expr_store/lower/asm.rs +++ b/crates/hir-def/src/expr_store/lower/asm.rs @@ -53,7 +53,11 @@ impl ExprCollector<'_> { } ast::AsmPiece::AsmOptions(opt) => { opt.asm_options().for_each(|opt| { - options |= match opt.syntax().first_token().map_or(T![$], |it| it.kind()) { + options |= match opt + .syntax() + .first_non_trivia_token() + .map_or(T![$], |it| it.kind()) + { T![att_syntax] => AsmOptions::ATT_SYNTAX, T![may_unwind] => AsmOptions::MAY_UNWIND, T![nomem] => AsmOptions::NOMEM, diff --git a/crates/hir-def/src/macro_expansion_tests/builtin_fn_macro.rs b/crates/hir-def/src/macro_expansion_tests/builtin_fn_macro.rs index 1ba636ee901c..fa7324b6e27f 100644 --- a/crates/hir-def/src/macro_expansion_tests/builtin_fn_macro.rs +++ b/crates/hir-def/src/macro_expansion_tests/builtin_fn_macro.rs @@ -262,6 +262,7 @@ macro_rules! compile_error { ($msg:expr,) => ({ /* compiler built-in */ }) } +// This expands to nothing (since it's in item position), but emits an error. /* error: error, with an escaped quote: " */ /* error: this is a raw string */ "##]], diff --git a/crates/hir-def/src/macro_expansion_tests/mbe.rs b/crates/hir-def/src/macro_expansion_tests/mbe.rs index 0a2d0bf12e7d..9389d63dae70 100644 --- a/crates/hir-def/src/macro_expansion_tests/mbe.rs +++ b/crates/hir-def/src/macro_expansion_tests/mbe.rs @@ -35,7 +35,8 @@ macro_rules! f { }; } -struct#0:MacroRules[BE8F, 0]@58..64#1922# MyTraitMap2#0:MacroCall[BE8F, 0]@31..42#ROOT2024# {#0:MacroRules[BE8F, 0]@72..73#1922# +// +spans+syntaxctxt +struct#0:MacroRules[BE8F, 0]@58..64#1922# MyTraitMap2#0:MacroCall[BE8F, 0]@10..21#ROOT2024# {#0:MacroRules[BE8F, 0]@72..73#1922# map#0:MacroRules[BE8F, 0]@86..89#1922#:#0:MacroRules[BE8F, 0]@89..90#1922# #0:MacroRules[BE8F, 0]@89..90#1922#::#0:MacroRules[BE8F, 0]@91..93#1922#std#0:MacroRules[BE8F, 0]@93..96#1922#::#0:MacroRules[BE8F, 0]@96..98#1922#collections#0:MacroRules[BE8F, 0]@98..109#1922#::#0:MacroRules[BE8F, 0]@109..111#1922#HashSet#0:MacroRules[BE8F, 0]@111..118#1922#<#0:MacroRules[BE8F, 0]@118..119#1922#(#0:MacroRules[BE8F, 0]@119..120#1922#)#0:MacroRules[BE8F, 0]@120..121#1922#>#0:MacroRules[BE8F, 0]@121..122#1922#,#0:MacroRules[BE8F, 0]@122..123#1922# }#0:MacroRules[BE8F, 0]@132..133#1922# "#]], @@ -75,12 +76,13 @@ macro_rules! f { }; } -fn#0:MacroCall[BE8F, 0]@30..32#ROOT2024# main#0:MacroCall[BE8F, 0]@33..37#ROOT2024#(#0:MacroCall[BE8F, 0]@37..38#ROOT2024#)#0:MacroCall[BE8F, 0]@38..39#ROOT2024# {#0:MacroCall[BE8F, 0]@40..41#ROOT2024# - 1#0:MacroCall[BE8F, 0]@50..51#ROOT2024#;#0:MacroCall[BE8F, 0]@51..52#ROOT2024# - 1.0#0:MacroCall[BE8F, 0]@61..64#ROOT2024#;#0:MacroCall[BE8F, 0]@64..65#ROOT2024# - (#0:MacroCall[BE8F, 0]@74..75#ROOT2024#(#0:MacroCall[BE8F, 0]@75..76#ROOT2024#1#0:MacroCall[BE8F, 0]@76..77#ROOT2024#,#0:MacroCall[BE8F, 0]@77..78#ROOT2024# )#0:MacroCall[BE8F, 0]@78..79#ROOT2024#,#0:MacroCall[BE8F, 0]@79..80#ROOT2024# )#0:MacroCall[BE8F, 0]@80..81#ROOT2024#.#0:MacroCall[BE8F, 0]@81..82#ROOT2024#0#0:MacroCall[BE8F, 0]@82..85#ROOT2024#.#0:MacroCall[BE8F, 0]@82..85#ROOT2024#0#0:MacroCall[BE8F, 0]@82..85#ROOT2024#;#0:MacroCall[BE8F, 0]@85..86#ROOT2024# - let#0:MacroCall[BE8F, 0]@95..98#ROOT2024# x#0:MacroCall[BE8F, 0]@99..100#ROOT2024# =#0:MacroCall[BE8F, 0]@101..102#ROOT2024# 1#0:MacroCall[BE8F, 0]@103..104#ROOT2024#;#0:MacroCall[BE8F, 0]@104..105#ROOT2024# -}#0:MacroCall[BE8F, 0]@110..111#ROOT2024# +// +spans+syntaxctxt +fn#0:MacroCall[BE8F, 0]@9..11#ROOT2024# main#0:MacroCall[BE8F, 0]@12..16#ROOT2024#(#0:MacroCall[BE8F, 0]@16..17#ROOT2024#)#0:MacroCall[BE8F, 0]@17..18#ROOT2024# {#0:MacroCall[BE8F, 0]@19..20#ROOT2024# + 1#0:MacroCall[BE8F, 0]@29..30#ROOT2024#;#0:MacroCall[BE8F, 0]@30..31#ROOT2024# + 1.0#0:MacroCall[BE8F, 0]@40..43#ROOT2024#;#0:MacroCall[BE8F, 0]@43..44#ROOT2024# + (#0:MacroCall[BE8F, 0]@53..54#ROOT2024#(#0:MacroCall[BE8F, 0]@54..55#ROOT2024#1#0:MacroCall[BE8F, 0]@55..56#ROOT2024#,#0:MacroCall[BE8F, 0]@56..57#ROOT2024# )#0:MacroCall[BE8F, 0]@57..58#ROOT2024#,#0:MacroCall[BE8F, 0]@58..59#ROOT2024# )#0:MacroCall[BE8F, 0]@59..60#ROOT2024#.#0:MacroCall[BE8F, 0]@60..61#ROOT2024#0#0:MacroCall[BE8F, 0]@61..64#ROOT2024#.#0:MacroCall[BE8F, 0]@61..64#ROOT2024#0#0:MacroCall[BE8F, 0]@61..64#ROOT2024#;#0:MacroCall[BE8F, 0]@64..65#ROOT2024# + let#0:MacroCall[BE8F, 0]@74..77#ROOT2024# x#0:MacroCall[BE8F, 0]@78..79#ROOT2024# =#0:MacroCall[BE8F, 0]@80..81#ROOT2024# 1#0:MacroCall[BE8F, 0]@82..83#ROOT2024#;#0:MacroCall[BE8F, 0]@83..84#ROOT2024# +}#0:MacroCall[BE8F, 0]@89..90#ROOT2024# "#]], @@ -423,6 +425,7 @@ m! { foo, bar } macro_rules! m { ($($i:ident),*) => ( impl Bar { $(fn $i() {})* } ); } +// +syntaxctxt impl#\1922# Bar#\1922# {#\1922# fn#\1922# foo#\ROOT2024#(#\1922#)#\1922# {#\1922#}#\1922# fn#\1922# bar#\ROOT2024#(#\1922#)#\1922# {#\1922#}#\1922# @@ -526,6 +529,7 @@ m! { 1 + 2 } macro_rules! m { ($ i:expr) => { fn bar() { $ i * 3; } } } +// +tree fn bar() { (1+2)*3; } @@ -646,6 +650,7 @@ macro_rules! structs { ($($i:ident),*) => { $(struct $i { field: u32 } )* } } +// +tree struct Foo { field: u32 } @@ -1736,6 +1741,7 @@ m!(C("0")); macro_rules! m { ($k:expr) => { fn f() { K::$k; } } } +// +tree +errors /* parse error: expected identifier, `self`, `super`, `crate`, or `Self` */ /* parse error: expected SEMICOLON */ /* parse error: expected SEMICOLON */ diff --git a/crates/hir-def/src/macro_expansion_tests/mbe/regression.rs b/crates/hir-def/src/macro_expansion_tests/mbe/regression.rs index cac248f47fff..198f99f14227 100644 --- a/crates/hir-def/src/macro_expansion_tests/mbe/regression.rs +++ b/crates/hir-def/src/macro_expansion_tests/mbe/regression.rs @@ -196,6 +196,7 @@ macro_rules! STRUCT { ); } +// from https://github.com/retep998/winapi-rs/blob/a7ef2bca086aae76cf6c4ce4c2552988ed9798ad/src/shared/d3d9caps.rs #[repr(C)] #[derive(Copy)] pub struct D3DVSHADERCAPS2_0 { pub Caps: u8, @@ -920,6 +921,7 @@ macro_rules! rgb_color { } }; } +// +tree +errors /* parse error: expected type */ /* parse error: expected R_PAREN */ /* parse error: expected R_ANGLE */ diff --git a/crates/hir-def/src/macro_expansion_tests/mod.rs b/crates/hir-def/src/macro_expansion_tests/mod.rs index 188f57f7dda7..45d258c62c40 100644 --- a/crates/hir-def/src/macro_expansion_tests/mod.rs +++ b/crates/hir-def/src/macro_expansion_tests/mod.rs @@ -33,7 +33,7 @@ use span::{ use stdx::{format_to, format_to_acc}; use syntax::{ AstNode, AstPtr, - SyntaxKind::{COMMENT, EOF, IDENT, LIFETIME_IDENT}, + SyntaxKind::{COMMENT, EOF, IDENT, LIFETIME_IDENT, TOKEN_TREE}, SyntaxNode, T, ast::{self, edit::IndentLevel}, }; @@ -76,7 +76,7 @@ fn check_errors(#[rust_analyzer::rust_fixture] ra_fixture: &str, expect: Expect) let ast = editioned_file_id.parse(&db).syntax_node(); let ast_id_map = ast_id.file_id.ast_id_map(&db); let node = ast_id_map.get_erased(ast_id.value).to_node(&ast); - Some((node.text_range(), errors)) + Some((node.text_range_without_outer_trivia(), errors)) }) .sorted_unstable_by_key(|(range, _)| range.start()) .format_with("\n", |(range, err), format| format(&format_args!("{range:?}: {err}"))) @@ -133,11 +133,18 @@ pub fn identity_when_valid(_attr: TokenStream, item: TokenStream) -> TokenStream let mut expect_errors = false; let mut show_spans = false; let mut show_ctxt = false; - for comment in call.syntax().children_with_tokens().filter(|it| it.kind() == COMMENT) { - tree |= comment.to_string().contains("+tree"); - expect_errors |= comment.to_string().contains("+errors"); - show_spans |= comment.to_string().contains("+spans"); - show_ctxt |= comment.to_string().contains("+syntaxctxt"); + for comment in call + .syntax() + .descendants_with_tokens() + .filter_map(|it| it.into_token()) + .filter(|it| it.parent_ancestors().all(|it| it.kind() != TOKEN_TREE)) + .flat_map(|it| it.leading_trivia().chain(it.trailing_trivia())) + .filter(|it| it.kind() == COMMENT) + { + tree |= comment.text().contains("+tree"); + expect_errors |= comment.text().contains("+errors"); + show_spans |= comment.text().contains("+spans"); + show_ctxt |= comment.text().contains("+syntaxctxt"); } let mut expn_text = String::new(); @@ -174,14 +181,14 @@ pub fn identity_when_valid(_attr: TokenStream, item: TokenStream) -> TokenStream .fold(String::new(), |mut acc, line| format_to_acc!(acc, "// {line}")); format_to!(expn_text, "\n{}", tree) } - let range = call.syntax().text_range(); + let range = call.syntax().text_range_without_outer_trivia(); let range: Range = range.into(); text_edits.push((range, expn_text)); } text_edits.sort_by_key(|(range, _)| range.start); text_edits.reverse(); - let mut expanded_text = source_file.to_string(); + let mut expanded_text = source_file.syntax().text().to_string(); for (range, text) in text_edits { expanded_text.replace_range(range, &text); } @@ -208,9 +215,21 @@ pub fn identity_when_valid(_attr: TokenStream, item: TokenStream) -> TokenStream let call = file_id.call_node(&db); let mut show_spans = false; let mut show_ctxt = false; - for comment in call.value.children_with_tokens().filter(|it| it.kind() == COMMENT) { - show_spans |= comment.to_string().contains("+spans"); - show_ctxt |= comment.to_string().contains("+syntaxctxt"); + for comment in call + .value + .first_non_trivia_token() + .into_iter() + .flat_map(|it| it.leading_trivia()) + .chain( + call.value + .last_non_trivia_token() + .into_iter() + .flat_map(|it| it.trailing_trivia()), + ) + .filter(|it| it.kind() == COMMENT) + { + show_spans |= comment.text().contains("+spans"); + show_ctxt |= comment.text().contains("+syntaxctxt"); } let pp = pretty_print_macro_expansion( src.value, @@ -314,13 +333,15 @@ fn pretty_print_macro_expansion( ) -> String { let mut res = String::new(); let mut prev_kind = EOF; + let mut prev_is_trivia = false; let mut indent_level = 0; - for token in iter::successors(expn.first_token(), |t| t.next_token()) + for token in iter::successors(expn.first_non_trivia_token(), |t| t.next_token()) .take_while(|token| token.text_range().start() < expn.text_range().end()) { let curr_kind = token.kind(); + let trivia_token = token.is_trivia(); let space = match (prev_kind, curr_kind) { - _ if prev_kind.is_trivia() || curr_kind.is_trivia() => "", + _ if prev_is_trivia || trivia_token => "", _ if prev_kind.is_literal() && !curr_kind.is_punct() => " ", (T!['{'], T!['}']) => "", (T![=], _) | (_, T![=]) => " ", @@ -363,7 +384,8 @@ fn pretty_print_macro_expansion( res.push_str(&" ".repeat(level)); } prev_kind = curr_kind; - format_to!(res, "{}", token); + prev_is_trivia = trivia_token; + res.push_str(token.text()); if show_spans || show_ctxt { let span = map.span_for_range(token.text_range()); format_to!(res, "#"); diff --git a/crates/hir-def/src/macro_expansion_tests/proc_macros.rs b/crates/hir-def/src/macro_expansion_tests/proc_macros.rs index 8c91cf6793a5..bcbf9e9b855a 100644 --- a/crates/hir-def/src/macro_expansion_tests/proc_macros.rs +++ b/crates/hir-def/src/macro_expansion_tests/proc_macros.rs @@ -263,9 +263,9 @@ fn foo(&self) { self.0. 1; } -fn#0:Fn[8A31, 0]@45..47#ROOT2024# foo#0:Fn[8A31, 0]@48..51#ROOT2024#(#0:Fn[8A31, 0]@51..52#ROOT2024#�:Fn[8A31, 0]@52..53#ROOT2024#self#0:Fn[8A31, 0]@53..57#ROOT2024# )#0:Fn[8A31, 0]@57..58#ROOT2024# {#0:Fn[8A31, 0]@59..60#ROOT2024# - self#0:Fn[8A31, 0]@65..69#ROOT2024# .#0:Fn[8A31, 0]@69..70#ROOT2024#0#0:Fn[8A31, 0]@70..71#ROOT2024#.#0:Fn[8A31, 0]@71..72#ROOT2024#1#0:Fn[8A31, 0]@73..74#ROOT2024#;#0:Fn[8A31, 0]@74..75#ROOT2024# -}#0:Fn[8A31, 0]@76..77#ROOT2024#"#]], +fn#0:Fn[8A31, 0]@25..27#ROOT2024# foo#0:Fn[8A31, 0]@28..31#ROOT2024#(#0:Fn[8A31, 0]@31..32#ROOT2024#�:Fn[8A31, 0]@32..33#ROOT2024#self#0:Fn[8A31, 0]@33..37#ROOT2024# )#0:Fn[8A31, 0]@37..38#ROOT2024# {#0:Fn[8A31, 0]@39..40#ROOT2024# + self#0:Fn[8A31, 0]@45..49#ROOT2024# .#0:Fn[8A31, 0]@49..50#ROOT2024#0#0:Fn[8A31, 0]@50..51#ROOT2024#.#0:Fn[8A31, 0]@51..52#ROOT2024#1#0:Fn[8A31, 0]@53..54#ROOT2024#;#0:Fn[8A31, 0]@54..55#ROOT2024# +}#0:Fn[8A31, 0]@56..57#ROOT2024#"#]], ); } diff --git a/crates/hir-expand/src/attrs.rs b/crates/hir-expand/src/attrs.rs index 185298d5f937..90a461ee8775 100644 --- a/crates/hir-expand/src/attrs.rs +++ b/crates/hir-expand/src/attrs.rs @@ -424,10 +424,10 @@ impl AttrId { ) -> TextRange { let (_, derive_attr) = self.find_attr_range(db, krate, owner); let ast::Meta::TokenTreeMeta(derive_attr) = derive_attr else { - return derive_attr.syntax().text_range(); + return derive_attr.syntax().text_range_without_outer_trivia(); }; let Some(tt) = derive_attr.token_tree() else { - return derive_attr.syntax().text_range(); + return derive_attr.syntax().text_range_without_outer_trivia(); }; // Fake the span map, as we don't really need spans here, just the offsets of the node in the file. let span_map = RealSpanMap::absolute(span::EditionedFileId::current_edition( @@ -442,11 +442,11 @@ impl AttrId { let Some((_, _, derive_tts)) = parse_path_comma_token_tree(db, &tt).nth(derive_index as usize) else { - return derive_attr.syntax().text_range(); + return derive_attr.syntax().text_range_without_outer_trivia(); }; let (Some(first_span), Some(last_span)) = (derive_tts.first_span(), derive_tts.last_span()) else { - return derive_attr.syntax().text_range(); + return derive_attr.syntax().text_range_without_outer_trivia(); }; let start = first_span.range.start(); let end = last_span.range.end(); diff --git a/crates/hir-expand/src/cfg_process.rs b/crates/hir-expand/src/cfg_process.rs index 45a81d3b3650..f161697be528 100644 --- a/crates/hir-expand/src/cfg_process.rs +++ b/crates/hir-expand/src/cfg_process.rs @@ -196,9 +196,8 @@ fn macro_input_callback( let kind = token.kind(); if kind == T![,] { break; - } else if !kind.is_trivia() { - break 'eat_comma; } + break 'eat_comma; } } events_until_comma += 1; diff --git a/crates/hir-expand/src/eager.rs b/crates/hir-expand/src/eager.rs index bddec50c91c0..f5d528f3c847 100644 --- a/crates/hir-expand/src/eager.rs +++ b/crates/hir-expand/src/eager.rs @@ -184,7 +184,7 @@ fn eager_macro_recur( WalkEvent::Leave(child) => { if let SyntaxElement::Token(t) = child { let start = t.text_range().start(); - offset += t.text_range().len(); + offset += t.text_range_including_trivia().len(); expanded_map.push(offset, span_map.span_at(start)); } continue; diff --git a/crates/hir-expand/src/files.rs b/crates/hir-expand/src/files.rs index 3524e0cb090c..eeeede658102 100644 --- a/crates/hir-expand/src/files.rs +++ b/crates/hir-expand/src/files.rs @@ -121,7 +121,7 @@ pub type ErasedAstId = crate::InFile; impl ErasedAstId { pub fn to_range(&self, db: &dyn SourceDatabase) -> TextRange { - self.to_ptr(db).text_range() + self.to_ptr(db).to_node(&self.file_id.parse_or_expand(db)).text_range_without_outer_trivia() } pub fn to_ptr(&self, db: &dyn SourceDatabase) -> SyntaxNodePtr { self.file_id.ast_id_map(db).get_erased(self.value) @@ -241,7 +241,10 @@ impl InFileWrapper { self.with_value(self.value.syntax()) } pub fn node_file_range(&self) -> FileRangeWrapper { - FileRangeWrapper { file_id: self.file_id, range: self.value.syntax().text_range() } + FileRangeWrapper { + file_id: self.file_id, + range: self.value.syntax().text_range_without_outer_trivia(), + } } } @@ -255,7 +258,10 @@ impl InFileWrapper { // region:specific impls impl> InFileWrapper { pub fn file_range(&self) -> FileRangeWrapper { - FileRangeWrapper { file_id: self.file_id, range: self.value.borrow().text_range() } + FileRangeWrapper { + file_id: self.file_id, + range: self.value.borrow().text_range_without_outer_trivia(), + } } } @@ -303,7 +309,7 @@ impl> InFile { } pub fn text_range(&self) -> TextRange { - self.value.borrow().text_range() + self.value.borrow().text_range_without_outer_trivia() } /// Falls back to the macro call range if the node cannot be mapped up fully. @@ -311,12 +317,16 @@ impl> InFile { /// For attributes and derives, this will point back to the attribute only. /// For the entire item use `InFile::original_file_range_full`. pub fn original_file_range_rooted(self, db: &dyn SourceDatabase) -> FileRange { - self.borrow().map(SyntaxNode::text_range).original_node_file_range_rooted(db) + self.borrow() + .map(SyntaxNode::text_range_without_outer_trivia) + .original_node_file_range_rooted(db) } /// Falls back to the macro call range if the node cannot be mapped up fully. pub fn original_file_range_with_macro_call_input(self, db: &dyn SourceDatabase) -> FileRange { - self.borrow().map(SyntaxNode::text_range).original_node_file_range_with_macro_call_input(db) + self.borrow() + .map(SyntaxNode::text_range_without_outer_trivia) + .original_node_file_range_with_macro_call_input(db) } pub fn original_syntax_node_rooted( @@ -340,7 +350,7 @@ impl> InFile { let FileRange { file_id: editioned_file_id, range } = map_node_range_up_rooted( db, file_id.expansion_span_map(db), - self.value.borrow().text_range(), + self.value.borrow().text_range_without_outer_trivia(), )?; let kind = self.kind(); @@ -349,7 +359,7 @@ impl> InFile { .syntax_node() .covering_element(range) .ancestors() - .take_while(|it| it.text_range() == range) + .take_while(|it| it.text_range_without_outer_trivia() == range) .find(|it| it.kind() == kind)?; Some(InRealFile::new(editioned_file_id, value)) } @@ -361,7 +371,9 @@ impl InFile<&SyntaxNode> { self, db: &dyn SourceDatabase, ) -> Option<(FileRange, SyntaxContext)> { - self.borrow().map(SyntaxNode::text_range).original_node_file_range_opt(db) + self.borrow() + .map(SyntaxNode::text_range_without_outer_trivia) + .original_node_file_range_opt(db) } } @@ -519,7 +531,7 @@ impl InFile { let FileRange { file_id: editioned_file_id, range } = map_node_range_up_rooted( db, file_id.expansion_span_map(db), - self.value.syntax().text_range(), + self.value.syntax().text_range_without_outer_trivia(), )?; // FIXME: This heuristic is brittle and with the right macro may select completely unrelated nodes? diff --git a/crates/hir-expand/src/lib.rs b/crates/hir-expand/src/lib.rs index e646c21ec8c5..ae9d10e46ea2 100644 --- a/crates/hir-expand/src/lib.rs +++ b/crates/hir-expand/src/lib.rs @@ -561,9 +561,10 @@ impl MacroCallId { let (is_derive, censor_item_tree_attr_ids, item_node, span) = match &loc.kind { MacroCallKind::FnLike { ast_id, .. } => { let node = &ast_id.to_ptr(db).to_node(&root); - let path_range = node - .path() - .map_or_else(|| node.syntax().text_range(), |path| path.syntax().text_range()); + let path_range = node.path().map_or_else( + || node.syntax().text_range_without_outer_trivia(), + |path| path.syntax().text_range_without_outer_trivia(), + ); let span = map.span_for_range(path_range); let dummy_tt = |kind| { @@ -632,8 +633,8 @@ impl MacroCallId { attr_ids.invoc_attr().find_attr_range_with_source(db, loc.krate, &node); let range = attr .path() - .map(|path| path.syntax().text_range()) - .unwrap_or_else(|| attr.syntax().text_range()); + .map(|path| path.syntax().text_range_without_outer_trivia()) + .unwrap_or_else(|| attr.syntax().text_range_without_outer_trivia()); let span = map.span_for_range(range); let is_derive = matches!(loc.def.kind, MacroDefKind::BuiltInAttr(_, expander) if expander.is_derive()); @@ -978,8 +979,10 @@ fn proc_macro_span(db: &dyn SourceDatabase, ast: AstId) -> Span { let ast_id_map = ast.file_id.ast_id_map(db); let node = ast_id_map.get(ast.value).to_node(&root); - let range = ast::HasName::name(&node) - .map_or_else(|| node.syntax().text_range(), |name| name.syntax().text_range()); + let range = ast::HasName::name(&node).map_or_else( + || node.syntax().text_range_without_outer_trivia(), + |name| name.syntax().text_range_without_outer_trivia(), + ); span_map.span_for_range(range) } proc_macro_span(db, ast, ()) @@ -1238,17 +1241,24 @@ impl MacroCallKind { node.path() .unwrap() .syntax() - .text_range() + .text_range_without_outer_trivia() .cover(node.excl_token().unwrap().text_range()) } MacroCallKind::Derive { ast_id, derive_attr_index, .. } => { // FIXME: should be the range of the macro name, not the whole derive - derive_attr_index.find_attr_range(db, krate, *ast_id).1.syntax().text_range() + derive_attr_index + .find_attr_range(db, krate, *ast_id) + .1 + .syntax() + .text_range_without_outer_trivia() } // FIXME: handle `cfg_attr` - MacroCallKind::Attr { ast_id, censored_attr_ids: attr_ids, .. } => { - attr_ids.invoc_attr().find_attr_range(db, krate, *ast_id).1.syntax().text_range() - } + MacroCallKind::Attr { ast_id, censored_attr_ids: attr_ids, .. } => attr_ids + .invoc_attr() + .find_attr_range(db, krate, *ast_id) + .1 + .syntax() + .text_range_without_outer_trivia(), }; let mut range = get_range(self); @@ -1482,8 +1492,13 @@ pub fn span_for_offset( // Avoid adding any more outside uses. pub fn resolve_span(db: &dyn SourceDatabase, Span { range, anchor, ctx: _ }: Span) -> FileRange { let file_id = EditionedFileId::from_span_file_id(db, anchor.file_id); - let anchor_offset = - HirFileId::from(file_id).ast_id_map(db).get_erased(anchor.ast_id).text_range().start(); + let root = HirFileId::from(file_id).parse_or_expand(db); + let anchor_offset = HirFileId::from(file_id) + .ast_id_map(db) + .get_erased(anchor.ast_id) + .to_node(&root) + .text_range_without_outer_trivia() + .start(); FileRange { file_id, range: range + anchor_offset } } diff --git a/crates/hir-expand/src/span_map.rs b/crates/hir-expand/src/span_map.rs index 192a3c06e5e2..1dbd53a15467 100644 --- a/crates/hir-expand/src/span_map.rs +++ b/crates/hir-expand/src/span_map.rs @@ -74,8 +74,9 @@ pub(crate) fn real_span_map( // this kind of joining makes them as stable as the AstIdMap (which is basically changing on // every input of the file)… - let item_to_entry = - |item: ast::Item| (item.syntax().text_range().start(), ast_id_map.ast_id(&item).erase()); + let item_to_entry = |item: ast::Item| { + (item.syntax().text_range_without_outer_trivia().start(), ast_id_map.ast_id(&item).erase()) + }; // Top level items make for great anchors as they are the most stable and a decent boundary pairs.extend(tree.items().map(item_to_entry)); // Unfortunately, assoc items are very common in Rust, so descend into those as well and make diff --git a/crates/hir-ty/src/tests.rs b/crates/hir-ty/src/tests.rs index 2e433e8be890..67d75f8fa592 100644 --- a/crates/hir-ty/src/tests.rs +++ b/crates/hir-ty/src/tests.rs @@ -388,15 +388,18 @@ fn infer_with_mismatches(content: &str, include_mismatches: bool) -> String { // sort ranges for consistency types.sort_by_key(|(node, _)| { - let range = node.value.text_range(); + let range = node.value.text_range_without_outer_trivia(); (range.start(), range.end()) }); for (node, ty) in &types { let (range, text) = if let Some(self_param) = ast::SelfParam::cast(node.value.clone()) { - (self_param.name().unwrap().syntax().text_range(), "self".to_owned()) + let name = self_param.name().unwrap(); + (name.syntax().text_range_without_outer_trivia(), "self".to_owned()) } else { - (node.value.text_range(), node.value.text().to_string().replace('\n', " ")) + let node = &node.value; + let range = node.text_range_without_outer_trivia(); + (range, node.text_without_outer_trivia().to_string().replace('\n', " ")) }; let macro_prefix = if node.file_id != file_id { "!" } else { "" }; format_to!( @@ -410,11 +413,11 @@ fn infer_with_mismatches(content: &str, include_mismatches: bool) -> String { } if include_mismatches { mismatches.sort_by_key(|(node, _)| { - let range = node.value.text_range(); + let range = node.value.text_range_without_outer_trivia(); (range.start(), range.end()) }); for (src_ptr, (expected, actual)) in &mismatches { - let range = src_ptr.value.text_range(); + let range = src_ptr.value.text_range_without_outer_trivia(); let macro_prefix = if src_ptr.file_id != file_id { "!" } else { "" }; format_to!( buf, diff --git a/crates/hir-ty/src/tests/closure_captures.rs b/crates/hir-ty/src/tests/closure_captures.rs index c951a5481c46..d57cdfc6841c 100644 --- a/crates/hir-ty/src/tests/closure_captures.rs +++ b/crates/hir-ty/src/tests/closure_captures.rs @@ -97,7 +97,7 @@ fn check_closure_captures(#[rust_analyzer::rust_fixture] ra_fixture: &str, expec syntax: InFileWrapper>, ) -> TextRange { let root = syntax.file_syntax(db); - syntax.value.to_node(&root).syntax().text_range() + syntax.value.to_node(&root).syntax().text_range_without_outer_trivia() } // FIXME: Deduplicate this with hir::Local::sources(). diff --git a/crates/hir/src/diagnostics.rs b/crates/hir/src/diagnostics.rs index a1ff564edcf5..edff81242055 100644 --- a/crates/hir/src/diagnostics.rs +++ b/crates/hir/src/diagnostics.rs @@ -738,8 +738,8 @@ fn precise_macro_call_location( .path() .and_then(|it| it.segment()) .and_then(|it| it.name_ref()) - .map(|it| it.syntax().text_range()); - let range = range.unwrap_or_else(|| node.syntax().text_range()); + .map(|it| it.syntax().text_range_without_outer_trivia()); + let range = range.unwrap_or_else(|| node.syntax().text_range_without_outer_trivia()); ast_id.with_value(range) } MacroCallKind::Derive { ast_id, derive_attr_index, derive_index, .. } => { @@ -747,8 +747,12 @@ fn precise_macro_call_location( ast_id.with_value(range) } MacroCallKind::Attr { ast_id, censored_attr_ids: attr_ids, .. } => { - let attr_range = - attr_ids.invoc_attr().find_attr_range(db, krate, *ast_id).1.syntax().text_range(); + let attr_range = attr_ids + .invoc_attr() + .find_attr_range(db, krate, *ast_id) + .1 + .syntax() + .text_range_without_outer_trivia(); ast_id.with_value(attr_range) } } @@ -844,12 +848,16 @@ impl<'a, 'db> DiagnosticsCollector<'a, 'db> { let (_, attr) = id.find_attr_range(self.db, self.krate, *ast); let derive = attr .path() - .map(|path| path.syntax().text_range()) - .unwrap_or_else(|| attr.syntax().text_range()); + .map(|path| path.syntax().text_range_without_outer_trivia()) + .unwrap_or_else(|| attr.syntax().text_range_without_outer_trivia()); self.acc.push(InvalidDeriveTarget { range: ast.with_value(derive) }.into()); } DefDiagnosticKind::MalformedDerive { ast, id } => { - let derive = id.find_attr_range(self.db, self.krate, *ast).1.syntax().text_range(); + let derive = id + .find_attr_range(self.db, self.krate, *ast) + .1 + .syntax() + .text_range_without_outer_trivia(); self.acc.push(MalformedDerive { range: ast.with_value(derive) }.into()); } DefDiagnosticKind::MacroDefError { ast, message } => { @@ -857,7 +865,7 @@ impl<'a, 'db> DiagnosticsCollector<'a, 'db> { self.acc.push( MacroDefError { node: InFile::new(ast.file_id, AstPtr::new(&node)), - name: node.name().map(|it| it.syntax().text_range()), + name: node.name().map(|it| it.syntax().text_range_without_outer_trivia()), message: message.clone(), } .into(), @@ -892,7 +900,8 @@ impl<'a, 'db> DiagnosticsCollector<'a, 'db> { + file_id .ast_id_map(self.db) .get_erased(err.span().anchor.ast_id) - .text_range() + .to_node(&file_id.parse_or_expand(self.db)) + .text_range_without_outer_trivia() .start(); } self.acc.push(MacroError { range, message, error, kind }.into()); diff --git a/crates/hir/src/has_source.rs b/crates/hir/src/has_source.rs index 3a6e19636a0b..549892dae628 100644 --- a/crates/hir/src/has_source.rs +++ b/crates/hir/src/has_source.rs @@ -40,7 +40,7 @@ pub trait HasSource: Sized { db: &dyn HirDatabase, ) -> Option)>> { let source = self.source(db)?; - Some(source.map(|node| (node.syntax().text_range(), Some(node)))) + Some(source.map(|node| (node.syntax().text_range_without_outer_trivia(), Some(node)))) } } @@ -178,9 +178,11 @@ impl HasSource for Function { db: &dyn HirDatabase, ) -> Option)>> { match self.id { - AnyFunctionId::FunctionId(id) => Some( - id.loc(db).source(db).map(|source| (source.syntax().text_range(), Some(source))), - ), + AnyFunctionId::FunctionId(id) => { + Some(id.loc(db).source(db).map(|source| { + (source.syntax().text_range_without_outer_trivia(), Some(source)) + })) + } AnyFunctionId::BuiltinDeriveImplMethod { impl_, .. } => { Some(impl_.loc(db).source(db).map(|range| (range, None))) } @@ -239,9 +241,11 @@ impl HasSource for Impl { db: &dyn HirDatabase, ) -> Option)>> { match self.id { - AnyImplId::ImplId(id) => Some( - id.loc(db).source(db).map(|source| (source.syntax().text_range(), Some(source))), - ), + AnyImplId::ImplId(id) => { + Some(id.loc(db).source(db).map(|source| { + (source.syntax().text_range_without_outer_trivia(), Some(source)) + })) + } AnyImplId::BuiltinDeriveImplId(impl_) => { Some(impl_.loc(db).source(db).map(|range| (range, None))) } diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs index b30815bbb560..8b7342998a3c 100644 --- a/crates/hir/src/semantics.rs +++ b/crates/hir/src/semantics.rs @@ -47,9 +47,8 @@ use smallvec::{SmallVec, smallvec}; use span::{FileId, SyntaxContext}; use stdx::{TupleExt, always}; use syntax::{ - AstNode, AstPtr, AstToken, Direction, SmolStr, SmolStrBuilder, SyntaxElement, SyntaxKind, - SyntaxNode, SyntaxNodePtr, SyntaxToken, T, TextRange, TextSize, - algo::skip_trivia_token, + AstNode, AstPtr, AstToken, SmolStr, SmolStrBuilder, SyntaxElement, SyntaxKind, SyntaxNode, + SyntaxNodePtr, SyntaxToken, T, TextRange, TextSize, ast::{self, HasAttrs as _, HasGenericParams}, }; @@ -273,7 +272,12 @@ impl Semantics<'_, DB> { ) -> impl Iterator + 'slf { node.token_at_offset(offset) .map(move |token| self.descend_into_macros_no_opaque(token, true)) - .map(|descendants| descendants.into_iter().filter_map(move |it| it.value.parent())) + .map(|descendants| { + descendants + .into_iter() + .filter(|it| !it.value.is_trivia()) + .filter_map(move |it| it.value.parent()) + }) // re-order the tokens from token_at_offset by returning the ancestors with the smaller first nodes first // See algo::ancestors_at_offset, which uses the same approach .kmerge_by(|left, right| left.text_range().len().lt(&right.text_range().len())) @@ -1011,9 +1015,8 @@ impl<'db> SemanticsImpl<'db> { // This might not be the correct way to do this, but it works for now let mut res = smallvec![]; let tokens = (|| { - // FIXME: the trivia skipping should not be necessary - let first = skip_trivia_token(node.syntax().first_token()?, Direction::Next)?; - let last = skip_trivia_token(node.syntax().last_token()?, Direction::Prev)?; + let first = node.syntax().first_non_trivia_token()?; + let last = node.syntax().last_non_trivia_token()?; Some((first, last)) })(); let (first, last) = match tokens { @@ -1030,7 +1033,7 @@ impl<'db> SemanticsImpl<'db> { &mut |InFile { value, .. }, _ctx| { if let Some(node) = value .parent_ancestors() - .take_while(|it| it.text_range() == value.text_range()) + .take_while(|it| it.text_range_without_outer_trivia() == value.text_range()) .find_map(N::cast) { res.push(node) @@ -1060,7 +1063,7 @@ impl<'db> SemanticsImpl<'db> { .tree_top() .covering_element(range) .ancestors() - .take_while(|it| it.text_range() == range) + .take_while(|it| it.text_range_without_outer_trivia() == range) .find_map(N::cast); if let Some(node) = node { res.push(node); @@ -1607,7 +1610,7 @@ impl<'db> SemanticsImpl<'db> { &self, token: SyntaxToken, ) -> impl Iterator + Clone + '_ { - token.parent().into_iter().flat_map(move |parent| self.ancestors_with_macros(parent)) + token.owning_node().into_iter().flat_map(move |parent| self.ancestors_with_macros(parent)) } /// Iterates the ancestors of the given node, climbing up macro expansions while doing so. diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs index 368e5e3c147f..0f1478b3bb82 100644 --- a/crates/hir/src/source_analyzer.rs +++ b/crates/hir/src/source_analyzer.rs @@ -138,10 +138,10 @@ impl<'db> SourceAnalyzer<'db> { None => scope_for(db, scopes, source_map, node), Some(offset) => { debug_assert!( - node.text_range().contains_inclusive(offset), + node.value.text_range().contains_inclusive(offset), "{:?} not in {:?}", offset, - node.text_range() + node.value.text_range() ); scope_for_offset(db, scopes, source_map, node.file_id, offset) } @@ -191,10 +191,10 @@ impl<'db> SourceAnalyzer<'db> { None => scope_for(db, scopes, source_map, node), Some(offset) => { debug_assert!( - node.text_range().contains_inclusive(offset), + node.value.text_range().contains_inclusive(offset), "{:?} not in {:?}", offset, - node.text_range() + node.value.text_range() ); scope_for_offset(db, scopes, source_map, node.file_id, offset) } @@ -236,10 +236,10 @@ impl<'db> SourceAnalyzer<'db> { None => scope_for(db, scopes, source_map, node), Some(offset) => { debug_assert!( - node.text_range().contains_inclusive(offset), + node.value.text_range().contains_inclusive(offset), "{:?} not in {:?}", offset, - node.text_range() + node.value.text_range() ); scope_for_offset(db, scopes, source_map, node.file_id, offset) } diff --git a/crates/ide-assists/src/handlers/add_braces.rs b/crates/ide-assists/src/handlers/add_braces.rs index 4bd987a3710a..b6fe21a0f82c 100644 --- a/crates/ide-assists/src/handlers/add_braces.rs +++ b/crates/ide-assists/src/handlers/add_braces.rs @@ -54,7 +54,7 @@ pub(crate) fn add_braces(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Opti ParentType::MatchArmExpr => "Add braces to this match arm expression", ParentType::Assignment => "Add braces to this assignment expression", }, - expr.syntax().text_range(), + expr.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(expr.syntax()); let make = editor.make(); diff --git a/crates/ide-assists/src/handlers/add_explicit_enum_discriminant.rs b/crates/ide-assists/src/handlers/add_explicit_enum_discriminant.rs index db9f9dc074be..c5a9a85a5802 100644 --- a/crates/ide-assists/src/handlers/add_explicit_enum_discriminant.rs +++ b/crates/ide-assists/src/handlers/add_explicit_enum_discriminant.rs @@ -54,7 +54,7 @@ pub(crate) fn add_explicit_enum_discriminant( acc.add( AssistId::refactor_rewrite("add_explicit_enum_discriminant"), "Add explicit enum discriminants", - enum_node.syntax().text_range(), + enum_node.syntax().text_range_without_outer_trivia(), |builder| { let mut radix = Radix::Decimal; for variant_node in variant_list.variants() { @@ -86,7 +86,7 @@ fn add_variant_discriminant( return; }; - let variant_range = variant_node.syntax().text_range(); + let variant_range = variant_node.syntax().text_range_without_outer_trivia(); let (group_size, prefix, text) = match radix { Radix::Binary => (4, "0b", format!("{discriminant:b}")), diff --git a/crates/ide-assists/src/handlers/add_explicit_type.rs b/crates/ide-assists/src/handlers/add_explicit_type.rs index e543005e67a4..1699be0b656a 100644 --- a/crates/ide-assists/src/handlers/add_explicit_type.rs +++ b/crates/ide-assists/src/handlers/add_explicit_type.rs @@ -44,7 +44,7 @@ pub(crate) fn add_explicit_type(acc: &mut Assists, ctx: &AssistContext<'_, '_>) }; let module = ctx.sema.scope(pat.syntax())?.module(); - let pat_range = pat.syntax().text_range(); + let pat_range = pat.syntax().text_range_without_outer_trivia(); // Don't enable the assist if there is a type ascription without any placeholders if let Some(ty) = &ascribed_ty { @@ -78,7 +78,8 @@ pub(crate) fn add_explicit_type(acc: &mut Assists, ctx: &AssistContext<'_, '_>) pat_range, |builder| match ascribed_ty { Some(ascribed_ty) => { - builder.replace(ascribed_ty.syntax().text_range(), inferred_type); + builder + .replace(ascribed_ty.syntax().text_range_without_outer_trivia(), inferred_type); } None => { builder.insert(pat_range.end(), format!(": {inferred_type}")); diff --git a/crates/ide-assists/src/handlers/add_label_to_loop.rs b/crates/ide-assists/src/handlers/add_label_to_loop.rs index e7a2b1345241..fd5a7b2646b0 100644 --- a/crates/ide-assists/src/handlers/add_label_to_loop.rs +++ b/crates/ide-assists/src/handlers/add_label_to_loop.rs @@ -38,17 +38,18 @@ pub(crate) fn add_label_to_loop(acc: &mut Assists, ctx: &AssistContext<'_, '_>) acc.add( AssistId::generate("add_label_to_loop"), "Add Label", - loop_expr.syntax().text_range(), + loop_expr.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(loop_expr.syntax()); let make = editor.make(); let label = make.lifetime("'l"); + let leading: String = loop_kw.leading_trivia().map(|it| it.text().to_owned()).collect(); let elements = vec![ - label.syntax().clone().into(), - make.token(T![:]).into(), - make.whitespace(" ").into(), + make.with_leading_trivia(label.syntax(), &leading), + make.with_trailing_trivia(make.token(T![:]), " "), ]; + editor.splice_leading_trivia(&loop_kw, .., []); editor.insert_all(Position::before(&loop_kw), elements); let annotation = @@ -92,8 +93,7 @@ fn insert_label_after_token( ) { let make = editor.make(); let label = make.lifetime("'l"); - let elements = vec![make.whitespace(" ").into(), label.syntax().clone().into()]; - editor.insert_all(Position::after(token), elements); + editor.insert(Position::after(token), make.prepend_leading_trivia(label.syntax(), " ")); editor.add_annotation(label.syntax(), annotation); } diff --git a/crates/ide-assists/src/handlers/add_lifetime_to_type.rs b/crates/ide-assists/src/handlers/add_lifetime_to_type.rs index dc847dcdbe7d..35fd1cf50211 100644 --- a/crates/ide-assists/src/handlers/add_lifetime_to_type.rs +++ b/crates/ide-assists/src/handlers/add_lifetime_to_type.rs @@ -38,7 +38,7 @@ pub(crate) fn add_lifetime_to_type(acc: &mut Assists, ctx: &AssistContext<'_, '_ } let changes = fetch_borrowed_types(&node)?; - let target = node.syntax().text_range(); + let target = node.syntax().text_range_without_outer_trivia(); acc.add(AssistId::quick_fix("add_lifetime_to_type"), "Add lifetime", target, |builder| { match node.generic_param_list() { @@ -49,7 +49,7 @@ pub(crate) fn add_lifetime_to_type(acc: &mut Assists, ctx: &AssistContext<'_, '_ } None => { if let Some(name) = node.name() { - builder.insert(name.syntax().text_range().end(), "<'a>"); + builder.insert(name.syntax().text_range_without_outer_trivia().end(), "<'a>"); } } } diff --git a/crates/ide-assists/src/handlers/add_missing_impl_members.rs b/crates/ide-assists/src/handlers/add_missing_impl_members.rs index 67fa68df1e9d..8de6366c607f 100644 --- a/crates/ide-assists/src/handlers/add_missing_impl_members.rs +++ b/crates/ide-assists/src/handlers/add_missing_impl_members.rs @@ -117,9 +117,11 @@ fn add_missing_impl_members_inner( let impl_ = ctx.sema.to_def(&impl_def)?; if ctx.token_at_offset().all(|t| { - t.parent_ancestors() - .take_while(|node| node != impl_def.syntax()) - .any(|s| ast::BlockExpr::can_cast(s.kind()) || ast::ParamList::can_cast(s.kind())) + t.owning_node().is_some_and(|node| { + node.ancestors() + .take_while(|node| node != impl_def.syntax()) + .any(|s| ast::BlockExpr::can_cast(s.kind()) || ast::ParamList::can_cast(s.kind())) + }) }) { return None; } @@ -150,7 +152,7 @@ fn add_missing_impl_members_inner( return None; } - let target = impl_def.syntax().text_range(); + let target = impl_def.syntax().text_range_without_outer_trivia(); acc.add(AssistId::quick_fix(assist_id), label, target, |edit| { let editor = edit.make_editor(impl_def.syntax()); let make = editor.make(); @@ -198,9 +200,9 @@ fn add_missing_impl_members_inner( assoc_item_list.add_items(&editor, new_assoc_items); } else { let assoc_item_list = make.assoc_item_list(new_assoc_items); - editor.insert_all( + editor.insert( Position::after(impl_def.syntax()), - vec![make.whitespace(" ").into(), assoc_item_list.syntax().clone().into()], + make.with_leading_trivia(assoc_item_list.syntax().clone(), " "), ); first_new_item = assoc_item_list.assoc_items().next(); } @@ -210,7 +212,7 @@ fn add_missing_impl_members_inner( if let DefaultMethods::No = mode && let Some(ast::AssocItem::Fn(func)) = &first_new_item && let Some(m) = func.syntax().descendants().find_map(ast::MacroCall::cast) - && m.syntax().text() == "todo!()" + && m.syntax().text_without_outer_trivia() == "todo!()" { placeholder = Some(m); } diff --git a/crates/ide-assists/src/handlers/add_missing_match_arms.rs b/crates/ide-assists/src/handlers/add_missing_match_arms.rs index 8e39cfc49c16..f09d1f2f5aec 100644 --- a/crates/ide-assists/src/handlers/add_missing_match_arms.rs +++ b/crates/ide-assists/src/handlers/add_missing_match_arms.rs @@ -285,7 +285,7 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext<'_, arms_edit.remove_wildcard_arms(ctx, &editor); arms_edit.add_comma_after_last_arm(ctx, &make, &editor); - arms_edit.append_arms(&missing_arms, &make, &editor); + arms_edit.append_arms(&missing_arms, &editor); if let Some(cap) = ctx.config.snippet_cap { if let Some(it) = missing_arms @@ -340,7 +340,7 @@ fn cursor_at_trivial_match_arm_list( if ast::Expr::cast(last_node.clone()).is_some_and(is_empty_expr) && last_node_range.contains(ctx.offset()) - && !last_node.text().contains_char('\n') + && !last_node.text_without_outer_trivia().contains_char('\n') { cov_mark::hit!(add_missing_match_arms_end_of_last_empty_arm); return Some(()); @@ -379,48 +379,33 @@ impl ArmsEdit { } let Some(range) = self.cover_edit_range(ctx, &arm) else { continue }; - let prev = match range.start() { - syntax::NodeOrToken::Node(node) => { - node.first_token().and_then(|it| it.prev_token()) - } - syntax::NodeOrToken::Token(tok) => tok.prev_token(), - }; - if let Some(prev) = prev - && prev.kind() == SyntaxKind::WHITESPACE + if arm.syntax().text_range_without_outer_trivia() + == ctx.sema.original_range(arm.syntax()).range { - editor.delete(prev); + editor.delete(arm.syntax()) + } else { + editor.delete_all(range) } - - editor.delete_all(range); } } - fn append_arms(&self, arms: &[ast::MatchArm], make: &SyntaxFactory, editor: &SyntaxEditor) { - let Some(mut before) = self.place.last_token() else { + fn append_arms(&self, arms: &[ast::MatchArm], editor: &SyntaxEditor) { + let Some(before) = self.place.last_non_trivia_token() else { stdx::never!("match arm list not contain any token"); return; }; - if let Some(prev) = before.prev_token() - && prev.kind() == SyntaxKind::WHITESPACE - { - before = prev; - } - let open_curly = - !self.place.text().contains_char('\n') || before.kind() == SyntaxKind::WHITESPACE; let indent = IndentLevel::from_node(&self.place); - let arm_indent = indent + 1; - let indent = make.whitespace(&format!("\n{indent}")); - let arm_indent = make.whitespace(&format!("\n{arm_indent}")); - let elements = arms + let arm_separator = format!("\n{}", indent + 1); + let elements: Vec<_> = arms .iter() - .flat_map(|arm| [arm_indent.clone().into(), arm.syntax().clone().into()]) - .chain(open_curly.then(|| indent.clone().into())) + .map(|arm| editor.make().with_leading_trivia(arm.syntax(), &arm_separator)) .collect(); + editor.insert_all(Position::before(&before), elements); - if before.kind() == SyntaxKind::WHITESPACE { - editor.replace_with_many(before, elements); - } else { - editor.insert_all(Position::before(before), elements); + let Some(pending) = editor.pending_token(&before) else { return }; + if pending.leading_trivia().all(|it| it.kind() != SyntaxKind::NEWLINE) { + let separator = format!("\n{indent}"); + editor.splice_leading_trivia(&before, .., ast::make::tokens::trivia(&separator)); } } diff --git a/crates/ide-assists/src/handlers/add_return_type.rs b/crates/ide-assists/src/handlers/add_return_type.rs index 453a1b26e08f..587764b78d83 100644 --- a/crates/ide-assists/src/handlers/add_return_type.rs +++ b/crates/ide-assists/src/handlers/add_return_type.rs @@ -31,7 +31,7 @@ pub(crate) fn add_return_type(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> FnType::Function => "Add this function's return type", FnType::Closure { .. } => "Add this closure's return type", }, - tail_expr.syntax().text_range(), + tail_expr.syntax().text_range_without_outer_trivia(), |builder| { match builder_edit_pos { InsertOrReplace::Insert(insert_pos, needs_whitespace) => { @@ -45,7 +45,10 @@ pub(crate) fn add_return_type(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> if let FnType::Closure { wrap_expr: true } = fn_type { cov_mark::hit!(wrap_closure_non_block_expr); // `|x| x` becomes `|x| -> T x` which is invalid, so wrap it in a block - builder.replace(tail_expr.syntax().text_range(), format!("{{{tail_expr}}}")); + builder.replace( + tail_expr.syntax().text_range_without_outer_trivia(), + format!("{{{tail_expr}}}"), + ); } }, ) @@ -67,7 +70,7 @@ fn ret_ty_to_action( Some(ast::Type::InferType(_)) | None => { cov_mark::hit!(existing_infer_ret_type); cov_mark::hit!(existing_infer_ret_type_closure); - Some(InsertOrReplace::Replace(ret_ty.syntax().text_range())) + Some(InsertOrReplace::Replace(ret_ty.syntax().text_range_without_outer_trivia())) } _ => { cov_mark::hit!(existing_ret_type); @@ -137,13 +140,13 @@ fn extract_tail(ctx: &AssistContext<'_, '_>) -> Option<(FnType, ast::Expr, Inser let node = ctx.find_node_at_offset::>()?; let (fn_type, tail_expr, return_type_range, action) = match node { Either::Left(closure) => { - let rpipe = closure.param_list()?.syntax().last_token()?; + let rpipe = closure.param_list()?.syntax().last_non_trivia_token()?; let rpipe_pos = rpipe.text_range().end(); let action = ret_ty_to_action(closure.ret_type(), rpipe)?; let body = closure.body()?; - let body_start = body.syntax().first_token()?.text_range().start(); + let body_start = body.syntax().first_non_trivia_token()?.text_range().start(); let (tail_expr, wrap_expr) = match body { ast::Expr::BlockExpr(block) => (block.tail_expr()?, false), body => (body, true), @@ -170,7 +173,7 @@ fn extract_tail(ctx: &AssistContext<'_, '_>) -> Option<(FnType, ast::Expr, Inser if return_type_range.contains_range(range) { cov_mark::hit!(cursor_in_ret_position); cov_mark::hit!(cursor_in_ret_position_closure); - } else if tail_expr.syntax().text_range().contains_range(range) { + } else if tail_expr.syntax().text_range_without_outer_trivia().contains_range(range) { cov_mark::hit!(cursor_on_tail); cov_mark::hit!(cursor_on_tail_closure); } else { diff --git a/crates/ide-assists/src/handlers/add_turbo_fish.rs b/crates/ide-assists/src/handlers/add_turbo_fish.rs index 53205910c8e3..1c99ddcffd8b 100644 --- a/crates/ide-assists/src/handlers/add_turbo_fish.rs +++ b/crates/ide-assists/src/handlers/add_turbo_fish.rs @@ -97,10 +97,11 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> let make = editor.make(); if let_stmt.semicolon_token().is_none() { - editor.insert( - Position::last_child_of(let_stmt.syntax()), - make.token(syntax::SyntaxKind::SEMICOLON), - ); + let position = match let_stmt.syntax().last_child_or_token() { + Some(last) => Position::after(last), + None => Position::last_child_of(let_stmt.syntax()), + }; + editor.insert(position, make.token(syntax::SyntaxKind::SEMICOLON)); } let placeholder_ty = make.ty_placeholder(); @@ -108,8 +109,7 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> if let Some(pat) = let_stmt.pat() { let elements = vec![ make.token(syntax::SyntaxKind::COLON).into(), - make.whitespace(" ").into(), - placeholder_ty.syntax().clone().into(), + make.with_leading_trivia(placeholder_ty.syntax(), " "), ]; editor.insert_all(Position::after(pat.syntax()), elements); if let Some(cap) = ctx.config.snippet_cap { diff --git a/crates/ide-assists/src/handlers/apply_demorgan.rs b/crates/ide-assists/src/handlers/apply_demorgan.rs index e2c1048bdb78..77c424670eee 100644 --- a/crates/ide-assists/src/handlers/apply_demorgan.rs +++ b/crates/ide-assists/src/handlers/apply_demorgan.rs @@ -205,7 +205,7 @@ pub(crate) fn apply_demorgan_iterator( let ast::Expr::ClosureExpr(closure_expr) = arg_expr else { return None }; let closure_body = closure_expr.body()?; - let op_range = method_call.syntax().text_range(); + let op_range = method_call.syntax().text_range_without_outer_trivia(); let label = format!("Apply De Morgan's law to `Iterator::{}`", name.text()); acc.add_group( &GroupLabel("Apply De Morgan's law".to_owned()), diff --git a/crates/ide-assists/src/handlers/auto_import.rs b/crates/ide-assists/src/handlers/auto_import.rs index dd082476d2d6..e9a9d0b14169 100644 --- a/crates/ide-assists/src/handlers/auto_import.rs +++ b/crates/ide-assists/src/handlers/auto_import.rs @@ -192,7 +192,7 @@ pub(super) fn find_importable_node<'db>( ActiveParameter::at_arg( &ctx.sema, list, - expr.syntax().text_range().start(), + expr.syntax().text_range_without_outer_trivia().start(), ).map(|ap| ap.ty) }, ast::LetStmt(stmt) => { diff --git a/crates/ide-assists/src/handlers/bind_unused_param.rs b/crates/ide-assists/src/handlers/bind_unused_param.rs index 5d3d8127baef..9d995693ef26 100644 --- a/crates/ide-assists/src/handlers/bind_unused_param.rs +++ b/crates/ide-assists/src/handlers/bind_unused_param.rs @@ -41,7 +41,7 @@ pub(crate) fn bind_unused_param(acc: &mut Assists, ctx: &AssistContext<'_, '_>) acc.add( AssistId::quick_fix("bind_unused_param"), format!("Bind as `let _ = {name};`"), - param.syntax().text_range(), + param.syntax().text_range_without_outer_trivia(), |builder| { let line_index = line_index(ctx.db(), ctx.vfs_file_id()); diff --git a/crates/ide-assists/src/handlers/change_visibility.rs b/crates/ide-assists/src/handlers/change_visibility.rs index 18d7faeb2b02..c95eb10442d5 100644 --- a/crates/ide-assists/src/handlers/change_visibility.rs +++ b/crates/ide-assists/src/handlers/change_visibility.rs @@ -66,14 +66,14 @@ fn add_vis(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Option<()> { return None; } check_is_not_variant(&field)?; - (vis_offset(field.syntax()), field_name.syntax().text_range()) + (vis_offset(field.syntax()), field_name.syntax().text_range_without_outer_trivia()) } else { let field = ctx.find_node_at_offset::()?; if field.visibility().is_some() { return None; } check_is_not_variant(&field)?; - (vis_offset(field.syntax()), field.syntax().text_range()) + (vis_offset(field.syntax()), field.syntax().text_range_without_outer_trivia()) }; acc.add( @@ -110,25 +110,25 @@ fn can_add(node: &SyntaxNode) -> bool { } fn change_vis(acc: &mut Assists, vis: ast::Visibility) -> Option<()> { - if vis.syntax().text() == "pub" { - let target = vis.syntax().text_range(); + if vis.syntax().text_without_outer_trivia() == "pub" { + let target = vis.syntax().text_range_without_outer_trivia(); return acc.add( AssistId::refactor_rewrite("change_visibility"), "Change Visibility to pub(crate)", target, |edit| { - edit.replace(vis.syntax().text_range(), "pub(crate)"); + edit.replace(vis.syntax().text_range_without_outer_trivia(), "pub(crate)"); }, ); } - if vis.syntax().text() == "pub(crate)" { - let target = vis.syntax().text_range(); + if vis.syntax().text_without_outer_trivia() == "pub(crate)" { + let target = vis.syntax().text_range_without_outer_trivia(); return acc.add( AssistId::refactor_rewrite("change_visibility"), "Change visibility to pub", target, |edit| { - edit.replace(vis.syntax().text_range(), "pub"); + edit.replace(vis.syntax().text_range_without_outer_trivia(), "pub"); }, ); } diff --git a/crates/ide-assists/src/handlers/convert_bool_then.rs b/crates/ide-assists/src/handlers/convert_bool_then.rs index 5ecc11ccc526..40b1c302bed7 100644 --- a/crates/ide-assists/src/handlers/convert_bool_then.rs +++ b/crates/ide-assists/src/handlers/convert_bool_then.rs @@ -74,7 +74,7 @@ pub(crate) fn convert_if_to_bool_then( return None; } - let target = expr.syntax().text_range(); + let target = expr.syntax().text_range_without_outer_trivia(); acc.add( AssistId::refactor_rewrite("convert_if_to_bool_then"), "Convert `if` expression to `bool::then` call", @@ -179,7 +179,7 @@ pub(crate) fn convert_bool_then_to_if( return None; } - let target = mcall.syntax().text_range(); + let target = mcall.syntax().text_range_without_outer_trivia(); acc.add( AssistId::refactor_rewrite("convert_bool_then_to_if"), "Convert `bool::then` call to `if`", diff --git a/crates/ide-assists/src/handlers/convert_bool_to_enum.rs b/crates/ide-assists/src/handlers/convert_bool_to_enum.rs index 865995def013..99df46a515fb 100644 --- a/crates/ide-assists/src/handlers/convert_bool_to_enum.rs +++ b/crates/ide-assists/src/handlers/convert_bool_to_enum.rs @@ -58,24 +58,25 @@ pub(crate) fn convert_bool_to_enum(acc: &mut Assists, ctx: &AssistContext<'_, '_ find_bool_node(ctx)?; let target_module = ctx.sema.scope(&target_node)?.module().nearest_non_block_module(ctx.db()); - let target = name.syntax().text_range(); + let target = name.syntax().text_range_without_outer_trivia(); acc.add( AssistId::refactor_rewrite("convert_bool_to_enum"), "Convert boolean to enum", target, |edit| { - let make = SyntaxFactory::without_mappings(); + let editor = edit.make_editor(&target_node); + let make = editor.make(); if let Some(ty) = &ty_annotation { cov_mark::hit!(replaces_ty_annotation); - edit.replace(ty.syntax().text_range(), "Bool"); + edit.replace(ty.syntax().text_range_without_outer_trivia(), "Bool"); } if let Some(initializer) = initializer { - replace_bool_expr(edit, initializer, &make); + replace_bool_expr(edit, initializer, make); } let usages = definition.usages(&ctx.sema).all(); - add_enum_def(edit, ctx, &usages, target_node, &target_module, &make); + add_enum_def(edit, ctx, &usages, target_node, &target_module, make); let mut delayed_mutations = Vec::new(); replace_usages( edit, @@ -84,7 +85,7 @@ pub(crate) fn convert_bool_to_enum(acc: &mut Assists, ctx: &AssistContext<'_, '_ definition, &target_module, &mut delayed_mutations, - &make, + make, ); for (file_id, scope, path) in delayed_mutations { let editor = edit.make_editor(scope.as_syntax_node()); @@ -182,9 +183,9 @@ fn find_bool_node<'db>(ctx: &AssistContext<'_, 'db>) -> Option } fn replace_bool_expr(edit: &mut SourceChangeBuilder, expr: ast::Expr, make: &SyntaxFactory) { - let expr_range = expr.syntax().text_range(); + let expr_range = expr.syntax().text_range_without_outer_trivia(); let enum_expr = bool_expr_to_enum_expr(expr, make); - edit.replace(expr_range, enum_expr.syntax().text()) + edit.replace(expr_range, enum_expr.syntax().text_without_outer_trivia()) } /// Converts an expression of type `bool` to one of the new enum type. @@ -251,7 +252,7 @@ fn replace_usages( cov_mark::hit!(replaces_negation); edit.replace( - prefix_expr.syntax().text_range(), + prefix_expr.syntax().text_range_without_outer_trivia(), format!("{inner_expr} == Bool::False"), ); } else if let Some((record_field, initializer)) = name @@ -296,11 +297,11 @@ fn replace_usages( _ => (), } } else if let Some((ty_annotation, initializer)) = find_assoc_const_usage(&name) { - edit.replace(ty_annotation.syntax().text_range(), "Bool"); + edit.replace(ty_annotation.syntax().text_range_without_outer_trivia(), "Bool"); replace_bool_expr(edit, initializer, make); } else if let Some(receiver) = find_method_call_expr_usage(&name) { edit.replace( - receiver.syntax().text_range(), + receiver.syntax().text_range_without_outer_trivia(), format!("({receiver} == Bool::True)"), ); } else if name.syntax().ancestors().find_map(ast::UseTree::cast).is_none() { @@ -504,8 +505,8 @@ fn add_enum_def( let enum_def = make_bool_enum(make_enum_pub, make).reset_indent().indent(indent); edit.insert( - insert_before.text_range().start(), - format!("{}\n\n{indent}", enum_def.syntax().text()), + insert_before.text_range_without_outer_trivia().start(), + format!("{}\n\n{indent}", enum_def.syntax().text_without_outer_trivia()), ); Some(()) @@ -524,14 +525,14 @@ fn node_to_insert_before(target_node: SyntaxNode) -> SyntaxNode { } fn make_bool_enum(make_pub: bool, make: &SyntaxFactory) -> ast::Enum { + let separator = make.with_trailing_trivia(make.token(T![,]), " "); let derive_eq = make.attr_outer(make.meta_token_tree( make.ident_path("derive"), make.token_tree( T!['('], vec![ NodeOrToken::Token(make.ident("PartialEq")), - NodeOrToken::Token(make.token(T![,])), - NodeOrToken::Token(make.whitespace(" ")), + NodeOrToken::Token(separator.into_token().unwrap()), NodeOrToken::Token(make.ident("Eq")), ], ), diff --git a/crates/ide-assists/src/handlers/convert_closure_to_fn.rs b/crates/ide-assists/src/handlers/convert_closure_to_fn.rs index 83effa11820b..5884e86b88dc 100644 --- a/crates/ide-assists/src/handlers/convert_closure_to_fn.rs +++ b/crates/ide-assists/src/handlers/convert_closure_to_fn.rs @@ -7,7 +7,7 @@ use ide_db::{ use stdx::format_to; use syntax::{ AstNode, Direction, SyntaxKind, SyntaxNode, T, TextSize, ToSmolStr, - algo::{skip_trivia_token, skip_whitespace_token}, + algo::skip_whitespace_token, ast::{ self, HasArgList, HasGenericParams, HasName, edit::{AstNodeEdit, IndentLevel}, @@ -112,24 +112,12 @@ pub(crate) fn convert_closure_to_fn(acc: &mut Assists, ctx: &AssistContext<'_, ' { is_async = true; ret_ty = ret_ty.future_output(ctx.db())?; - let end = async_token - .siblings_with_tokens(Direction::Next) - .skip(1) - .take_while(|it| it.kind() == SyntaxKind::WHITESPACE) - .last() - .unwrap_or_else(|| async_token.clone().into()); - editor.delete_all(async_token.into()..=end); + editor.delete(async_token); } if let Some(gen_token) = block.gen_token() { is_gen = true; ret_ty = ret_ty.iterator_item(ctx.db())?; - let end = gen_token - .siblings_with_tokens(Direction::Next) - .skip(1) - .take_while(|it| it.kind() == SyntaxKind::WHITESPACE) - .last() - .unwrap_or_else(|| gen_token.clone().into()); - editor.delete_all(gen_token.into()..=end); + editor.delete(gen_token); } if block.try_block_modifier().is_none() @@ -144,7 +132,7 @@ pub(crate) fn convert_closure_to_fn(acc: &mut Assists, ctx: &AssistContext<'_, ' acc.add( AssistId::refactor_rewrite("convert_closure_to_fn"), "Convert closure to fn", - closure.param_list()?.syntax().text_range(), + closure.param_list()?.syntax().text_range_without_outer_trivia(), |builder| { let make = editor.make(); let closure_name_or_default = closure_name @@ -268,12 +256,16 @@ pub(crate) fn convert_closure_to_fn(acc: &mut Assists, ctx: &AssistContext<'_, ' false, is_gen, ); - fn_ = fn_.dedent(IndentLevel::from_token(&fn_.syntax().last_token().unwrap())); + fn_ = + fn_.dedent(IndentLevel::from_token(&fn_.syntax().last_non_trivia_token().unwrap())); match &closure_name { Some((closure_decl, _, _)) => { fn_ = fn_.indent(closure_decl.indent_level()); - builder.replace(closure_decl.syntax().text_range(), fn_.to_string()); + builder.replace( + closure_decl.syntax().text_range_without_outer_trivia(), + fn_.to_string(), + ); } None => { let Some(top_stmt) = @@ -289,7 +281,7 @@ pub(crate) fn convert_closure_to_fn(acc: &mut Assists, ctx: &AssistContext<'_, ' return; }; builder.replace( - closure.syntax().text_range(), + closure.syntax().text_range_without_outer_trivia(), closure_name_or_default.to_string(), ); match top_stmt { @@ -298,28 +290,32 @@ pub(crate) fn convert_closure_to_fn(acc: &mut Assists, ctx: &AssistContext<'_, ' fn_ = fn_.indent(indent); let range = stmt .syntax() - .first_token() + .first_non_trivia_token() .and_then(|token| { skip_whitespace_token(token.prev_token()?, Direction::Prev) }) .map(|it| it.text_range().end()) - .unwrap_or_else(|| stmt.syntax().text_range().start()); + .unwrap_or_else(|| { + stmt.syntax().text_range_without_outer_trivia().start() + }); builder.insert(range, format!("\n{indent}{fn_}")); } Either::Right(Either::Left(closure_inside_closure)) => { let Some(closure_body) = closure_inside_closure.body() else { return }; // FIXME: Maybe we can indent this properly, adding newlines and all, but this is hard. builder.insert( - closure_body.syntax().text_range().start(), + closure_body.syntax().text_range_without_outer_trivia().start(), format!("{{ {fn_} "), ); - builder - .insert(closure_body.syntax().text_range().end(), " }".to_owned()); + builder.insert( + closure_body.syntax().text_range_without_outer_trivia().end(), + " }".to_owned(), + ); } Either::Right(Either::Right(block_expr)) => { let Some(tail_expr) = block_expr.tail_expr() else { return }; let Some(insert_in) = - tail_expr.syntax().first_token().and_then(|token| { + tail_expr.syntax().first_non_trivia_token().and_then(|token| { skip_whitespace_token(token.prev_token()?, Direction::Prev) }) else { @@ -607,9 +603,11 @@ fn handle_call( ast::CallExpr::cast(peel_blocks_and_refs_and_parens(closure_ref).syntax().parent()?)?; let args = call.arg_list()?; // The really last token is `)`; we need one before that. - let has_trailing_comma = args.syntax().last_token()?.prev_token().is_some_and(|token| { - skip_trivia_token(token, Direction::Prev).is_some_and(|token| token.kind() == T![,]) - }); + let has_trailing_comma = args + .syntax() + .last_non_trivia_token()? + .prev_non_trivia_token() + .is_some_and(|token| token.kind() == T![,]); let has_existing_args = args.args().next().is_some(); let FileRangeWrapper { file_id, range } = ctx.sema.original_range_opt(args.syntax())?; diff --git a/crates/ide-assists/src/handlers/convert_comment_block.rs b/crates/ide-assists/src/handlers/convert_comment_block.rs index ace5fc3d757b..f47b3c3bc40b 100644 --- a/crates/ide-assists/src/handlers/convert_comment_block.rs +++ b/crates/ide-assists/src/handlers/convert_comment_block.rs @@ -1,7 +1,11 @@ +use std::iter::successors; + use itertools::Itertools; use syntax::{ - AstToken, SyntaxToken, TextRange, - ast::{self, CommentKind, CommentShape, Whitespace, edit::IndentLevel}, + AstToken, + SyntaxKind::{NEWLINE, WHITESPACE}, + TextRange, + ast::{self, CommentKind, CommentShape, edit::IndentLevel}, }; use crate::{AssistContext, AssistId, Assists}; @@ -24,8 +28,11 @@ use crate::{AssistContext, AssistId, Assists}; pub(crate) fn convert_comment_block(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Option<()> { let comment = ctx.find_token_at_offset::()?; // Only allow comments which are alone on their line - if let Some(prev) = comment.syntax().prev_token() { - Whitespace::cast(prev).filter(|w| w.text().contains('\n'))?; + if successors(comment.syntax().prev_token(), |it| it.prev_token()) + .find(|it| it.kind() != WHITESPACE) + .is_some_and(|it| it.kind() != NEWLINE) + { + return None; } match comment.shape() { @@ -111,26 +118,37 @@ pub(crate) fn relevant_line_comments(comment: &ast::AnyComment) -> Vec (), + NEWLINE => { + blank_lines += 1; + if blank_lines > 1 { + break; + } + } + _ => match ast::AnyComment::cast(token.clone()).filter(same_kind) { + Some(comment) => { + res.push(comment); + blank_lines = 0; + } + None => break, + }, + } + current = if forward { token.next_token() } else { token.prev_token() }; + } + res }; - // Find all preceding comments (in reverse order) that have the same prefix - let prev_comments = std::iter::successors(Some(comment.syntax().clone()), |it| it.prev_token()) - .filter(|s| !skippable(s)) - .map_while(ast::AnyComment::cast) - .take_while(same_kind) - .skip(1); // skip the first element so we don't duplicate it in next_comments - - let next_comments = std::iter::successors(Some(comment.syntax().clone()), |it| it.next_token()) - .filter(|s| !skippable(s)) - .map_while(ast::AnyComment::cast) - .take_while(same_kind); - - let mut comments: Vec<_> = prev_comments.collect(); + let mut comments = run(false); comments.reverse(); - comments.extend(next_comments); + comments.push(comment.clone()); + comments.extend(run(true)); comments } diff --git a/crates/ide-assists/src/handlers/convert_comment_from_or_to_doc.rs b/crates/ide-assists/src/handlers/convert_comment_from_or_to_doc.rs index ae2b98423d81..2031caf76f86 100644 --- a/crates/ide-assists/src/handlers/convert_comment_from_or_to_doc.rs +++ b/crates/ide-assists/src/handlers/convert_comment_from_or_to_doc.rs @@ -1,7 +1,9 @@ +use std::iter::successors; + use itertools::Itertools; use syntax::{ AstToken, TextRange, - ast::{self, AttrKind, Whitespace, edit::IndentLevel}, + ast::{self, AttrKind, edit::IndentLevel}, }; use crate::{ @@ -182,11 +184,12 @@ fn can_be_doc_comment(comment: &ast::AnyComment) -> Option { use syntax::SyntaxKind::*; // if the comment is not on its own line, then we do not propose anything. - match comment.syntax().prev_token() { - Some(prev) => { - // There was a previous token, now check if it was a newline - Whitespace::cast(prev).filter(|w| w.text().contains('\n'))?; - } + match successors(comment.syntax().prev_token(), |it| it.prev_token()) + .find(|it| it.kind() != WHITESPACE) + { + // There was a previous token, now check if it was a newline + Some(prev) if prev.kind() != NEWLINE => return None, + Some(_) => (), // There is no previous token, this is the start of the file. None => return Some(AttrKind::Inner), } diff --git a/crates/ide-assists/src/handlers/convert_for_to_while_let.rs b/crates/ide-assists/src/handlers/convert_for_to_while_let.rs index d45c4292b8ed..2364917f11ab 100644 --- a/crates/ide-assists/src/handlers/convert_for_to_while_let.rs +++ b/crates/ide-assists/src/handlers/convert_for_to_while_let.rs @@ -3,7 +3,6 @@ use ide_db::{famous_defs::FamousDefs, syntax_helpers::suggest_name}; use syntax::{ AstNode, ast::{self, HasAttrs, HasLoopBody, edit::IndentLevel}, - syntax_editor::Position, }; use crate::{AssistContext, AssistId, Assists}; @@ -38,7 +37,7 @@ pub(crate) fn convert_for_loop_to_while_let( let iterable = for_loop.iterable()?; let pat = for_loop.pat()?; let body = for_loop.loop_body()?; - if body.syntax().text_range().start() < ctx.offset() { + if body.syntax().text_range_without_outer_trivia().start() < ctx.offset() { cov_mark::hit!(not_available_in_body); return None; } @@ -46,7 +45,7 @@ pub(crate) fn convert_for_loop_to_while_let( acc.add( AssistId::refactor_rewrite("convert_for_loop_to_while_let"), "Replace this for loop with `while let`", - for_loop.syntax().text_range(), + for_loop.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(for_loop.syntax()); let make = editor.make(); @@ -81,17 +80,20 @@ pub(crate) fn convert_for_loop_to_while_let( let indent = IndentLevel::from_node(for_loop.syntax()); if let Some(label) = for_loop.label() { - let label = label.syntax(); - editor.insert(Position::before(for_loop.syntax()), make.whitespace(" ")); - editor.insert(Position::before(for_loop.syntax()), label); + editor.insert_taking_leading( + for_loop.syntax(), + make.with_trailing_trivia(label.syntax(), " "), + ); } + crate::utils::insert_attributes(for_loop.syntax(), &editor, for_loop.attrs()); - editor.insert( - Position::before(for_loop.syntax()), - make.whitespace(format!("\n{indent}").as_str()), + crate::utils::insert_before_with_separator( + &editor, + for_loop.syntax(), + mut_expr.syntax(), + &format!("\n{indent}"), ); - editor.insert(Position::before(for_loop.syntax()), mut_expr.syntax()); let opt_pat = make.tuple_struct_pat(make.ident_path("Some"), [pat]); let iter_next_expr = make.expr_method_call( diff --git a/crates/ide-assists/src/handlers/convert_from_to_tryfrom.rs b/crates/ide-assists/src/handlers/convert_from_to_tryfrom.rs index 3e11ee804a6b..a85117dbef83 100644 --- a/crates/ide-assists/src/handlers/convert_from_to_tryfrom.rs +++ b/crates/ide-assists/src/handlers/convert_from_to_tryfrom.rs @@ -1,7 +1,7 @@ use ide_db::{famous_defs::FamousDefs, traits::resolve_target_trait}; use syntax::ast::edit::IndentLevel; use syntax::ast::{self, AstNode, HasGenericArgs, HasName, syntax_factory::SyntaxFactory}; -use syntax::syntax_editor::{Element, Position}; +use syntax::syntax_editor::Position; use crate::{AssistContext, AssistId, Assists}; @@ -75,7 +75,7 @@ pub(crate) fn convert_from_to_tryfrom( acc.add( AssistId::refactor_rewrite("convert_from_to_tryfrom"), "Convert From to TryFrom", - impl_.syntax().text_range(), + impl_.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(impl_.syntax()); let make = editor.make(); @@ -106,13 +106,12 @@ pub(crate) fn convert_from_to_tryfrom( } let indent = IndentLevel::from_token(&associated_l_curly) + 1; - editor.insert_all( + editor.insert( Position::after(associated_l_curly), - vec![ - make.whitespace(&format!("\n{indent}")).syntax_element(), - error_type.syntax().syntax_element(), - make.whitespace("\n").syntax_element(), - ], + make.with_trailing_trivia( + make.with_leading_trivia(error_type.syntax(), &format!("\n{indent}")), + "\n", + ), ); builder.add_file_edits(ctx.vfs_file_id(), editor); }, diff --git a/crates/ide-assists/src/handlers/convert_into_to_from.rs b/crates/ide-assists/src/handlers/convert_into_to_from.rs index c8de14bed4bb..af096ead0ccb 100644 --- a/crates/ide-assists/src/handlers/convert_into_to_from.rs +++ b/crates/ide-assists/src/handlers/convert_into_to_from.rs @@ -87,7 +87,7 @@ pub(crate) fn convert_into_to_from(acc: &mut Assists, ctx: &AssistContext<'_, '_ acc.add( AssistId::refactor_rewrite("convert_into_to_from"), "Convert Into to From", - impl_.syntax().text_range(), + impl_.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(impl_.syntax()); let make = editor.make(); diff --git a/crates/ide-assists/src/handlers/convert_iter_for_each_to_for.rs b/crates/ide-assists/src/handlers/convert_iter_for_each_to_for.rs index 9506a963183e..6487b7ceac44 100644 --- a/crates/ide-assists/src/handlers/convert_iter_for_each_to_for.rs +++ b/crates/ide-assists/src/handlers/convert_iter_for_each_to_for.rs @@ -104,7 +104,7 @@ pub(crate) fn convert_for_loop_with_for_each( let iterable = for_loop.iterable()?; let pat = for_loop.pat()?; let body = for_loop.loop_body()?; - if body.syntax().text_range().start() < ctx.offset() { + if body.syntax().text_range_without_outer_trivia().start() < ctx.offset() { cov_mark::hit!(not_available_in_body); return None; } @@ -112,7 +112,7 @@ pub(crate) fn convert_for_loop_with_for_each( acc.add( AssistId::refactor_rewrite("convert_for_loop_with_for_each"), "Replace this for loop with `Iterator::for_each`", - for_loop.syntax().text_range(), + for_loop.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(for_loop.syntax()); let make = editor.make(); @@ -209,7 +209,8 @@ fn validate_method_call_expr( expr: ast::MethodCallExpr, ) -> Option<(ast::Expr, ast::Expr)> { let name_ref = expr.name_ref()?; - if !name_ref.syntax().text_range().contains_range(ctx.selection_trimmed()) { + if !name_ref.syntax().text_range_without_outer_trivia().contains_range(ctx.selection_trimmed()) + { cov_mark::hit!(test_for_each_not_applicable_invalid_cursor_pos); return None; } diff --git a/crates/ide-assists/src/handlers/convert_let_else_to_match.rs b/crates/ide-assists/src/handlers/convert_let_else_to_match.rs index 65c1c7cb70e7..8b71eb1d2658 100644 --- a/crates/ide-assists/src/handlers/convert_let_else_to_match.rs +++ b/crates/ide-assists/src/handlers/convert_let_else_to_match.rs @@ -70,7 +70,7 @@ pub(crate) fn convert_let_else_to_match( } else { "Convert let-else to let and match" }, - let_stmt.syntax().text_range(), + let_stmt.syntax().text_range_without_outer_trivia(), |builder| { let make = editor.make(); let binding_paths = bindings diff --git a/crates/ide-assists/src/handlers/convert_match_to_let_else.rs b/crates/ide-assists/src/handlers/convert_match_to_let_else.rs index db084c6ea21d..e13ece84704c 100644 --- a/crates/ide-assists/src/handlers/convert_match_to_let_else.rs +++ b/crates/ide-assists/src/handlers/convert_match_to_let_else.rs @@ -35,7 +35,7 @@ pub(crate) fn convert_match_to_let_else( ) -> Option<()> { let let_stmt: ast::LetStmt = ctx.find_node_at_offset()?; let pat = let_stmt.pat()?; - if ctx.offset() > pat.syntax().text_range().end() { + if ctx.offset() > pat.syntax().text_range_without_outer_trivia().end() { return None; } @@ -60,7 +60,7 @@ pub(crate) fn convert_match_to_let_else( acc.add( AssistId::refactor_rewrite("convert_match_to_let_else"), "Convert match to let-else", - let_stmt.syntax().text_range(), + let_stmt.syntax().text_range_without_outer_trivia(), |builder| { let extracting_arm_pat = rename_variable(&extracting_arm_pat, &extracted_variable_positions, pat); @@ -73,7 +73,7 @@ pub(crate) fn convert_match_to_let_else( ("", "") }; builder.replace( - let_stmt.syntax().text_range(), + let_stmt.syntax().text_range_without_outer_trivia(), format!("let {open_paren}{extracting_arm_pat}{close_paren} = {initializer_expr} else {diverging_arm_expr};"), ) }, @@ -132,11 +132,12 @@ fn find_extracted_variable(ctx: &AssistContext<'_, '_>, arm: &ast::MatchArm) -> // Rename `extracted` with `binding` in `pat`. fn rename_variable(pat: &ast::Pat, extracted: &[Name], binding: ast::Pat) -> SyntaxNode { + let binding = binding.detached(); let (editor, syntax) = SyntaxEditor::new(pat.syntax().clone()); let make = editor.make(); let extracted = extracted .iter() - .map(|e| e.syntax().text_range() - pat.syntax().text_range().start()) + .map(|e| e.syntax().text_range_without_outer_trivia() - pat.syntax().text_range().start()) .map(|r| syntax.covering_element(r)) .collect::>(); for extracted_syntax in extracted { @@ -157,7 +158,7 @@ fn rename_variable(pat: &ast::Pat, extracted: &[Name], binding: ast::Pat) -> Syn } let new_node = editor.finish().new_root().clone(); if let Some(pat) = ast::Pat::cast(new_node.clone()) { - pat.dedent(1.into()).syntax().clone() + pat.dedent(1.into()).detached().syntax().clone() } else { new_node } diff --git a/crates/ide-assists/src/handlers/convert_named_struct_to_tuple_struct.rs b/crates/ide-assists/src/handlers/convert_named_struct_to_tuple_struct.rs index 72418f155962..204c62be8fdd 100644 --- a/crates/ide-assists/src/handlers/convert_named_struct_to_tuple_struct.rs +++ b/crates/ide-assists/src/handlers/convert_named_struct_to_tuple_struct.rs @@ -1,11 +1,10 @@ use either::Either; use ide_db::{defs::Definition, search::FileReference}; use syntax::{ - NodeOrToken, SyntaxKind, SyntaxNode, T, - algo::next_non_trivia_token, + NodeOrToken, SyntaxKind, SyntaxNode, SyntaxToken, T, ast::{self, AstNode, HasAttrs, HasGenericParams, HasVisibility}, match_ast, - syntax_editor::{Element, Position, SyntaxEditor}, + syntax_editor::{Position, SyntaxEditor}, }; use crate::{ @@ -65,7 +64,7 @@ pub(crate) fn convert_named_struct_to_tuple_struct( .or_else(|| ctx.find_node_at_offset::().map(Either::Right))?; let field_list = strukt_or_variant.as_ref().either(|s| s.field_list(), |v| v.field_list())?; - if ctx.offset() > field_list.syntax().text_range().start() { + if ctx.offset() > field_list.syntax().text_range_without_outer_trivia().start() { // Assist could be distracting after the braces return None; } @@ -82,7 +81,7 @@ pub(crate) fn convert_named_struct_to_tuple_struct( acc.add( AssistId::refactor_rewrite("convert_named_struct_to_tuple_struct"), "Convert to tuple struct", - strukt_or_variant.syntax().text_range(), + strukt_or_variant.syntax().text_range_without_outer_trivia(), |builder| { edit_field_references(ctx, builder, record_fields.fields()); edit_struct_references(ctx, builder, strukt_def); @@ -107,7 +106,9 @@ fn edit_struct_def( SyntaxEditor::with_ast_node(&make.tuple_field(f.visibility(), f.ty()?)); field_editor.insert_all( Position::first_child_of(field.syntax()), - f.attrs().map(|attr| attr.syntax().clone().into()).collect(), + f.attrs() + .map(|attr| field_editor.make().with_trailing_trivia(attr.syntax(), "")) + .collect(), ); let field_syntax = field_editor.finish().new_root().clone(); ast::TupleField::cast(field_syntax) @@ -121,19 +122,12 @@ fn edit_struct_def( editor.delete(w.syntax()); elements.extend([ - make.whitespace("\n").into(), - remove_trailing_comma(w).into(), + make.with_leading_trivia(remove_trailing_comma(w), "\n"), make.token(T![;]).into(), - make.whitespace("\n").into(), ]); - if let Some(tok) = strukt - .generic_param_list() - .and_then(|l| l.r_angle_token()) - .and_then(|tok| tok.next_token()) - .filter(|tok| tok.kind() == SyntaxKind::WHITESPACE) - { - editor.delete(tok); + if let Some(r_angle) = strukt.generic_param_list().and_then(|l| l.r_angle_token()) { + editor.strip_trailing_blank_trivia(&r_angle); } } else { elements.push(make.token(T![;]).into()); @@ -141,12 +135,8 @@ fn edit_struct_def( } editor.replace_with_many(record_fields.syntax(), elements); - if let Some(tok) = record_fields - .l_curly_token() - .and_then(|tok| tok.prev_token()) - .filter(|tok| tok.kind() == SyntaxKind::WHITESPACE) - { - editor.delete(tok) + if let Some(prev) = record_fields.l_curly_token().and_then(|tok| tok.prev_non_trivia_token()) { + editor.strip_trailing_blank_trivia(&prev); } builder.add_file_edits(ctx.vfs_file_id(), editor); @@ -242,21 +232,26 @@ where let list_range = cover_edit_range(source.syntax(), orig.range); let l_curly = match list_range.start() { - NodeOrToken::Node(node) => node.first_token()?, + NodeOrToken::Node(node) => node.first_non_trivia_token()?, NodeOrToken::Token(t) => t.clone(), }; let r_curly = match list_range.end() { - NodeOrToken::Node(node) => node.last_token()?, + NodeOrToken::Node(node) => node.last_non_trivia_token()?, NodeOrToken::Token(t) => t.clone(), }; if l_curly.kind() == T!['{'] { - delete_whitespace(editor, l_curly.prev_token()); - delete_whitespace(editor, l_curly.next_token()); - editor.replace(l_curly, make.token(T!['('])); + strip_inline_space(editor, l_curly.prev_non_trivia_token()); + let trailing: String = l_curly.trailing_trivia().map(|it| it.text().to_owned()).collect(); + let open = make.token(T!['(']); + if trailing.contains('\n') { + editor.replace_verbatim(l_curly, make.with_trailing_trivia(open, &trailing)) + } else { + editor.replace_verbatim(l_curly, open) + } } if r_curly.kind() == T!['}'] { - delete_whitespace(editor, r_curly.prev_token()); + strip_inline_space(editor, r_curly.prev_non_trivia_token()); editor.replace(r_curly, make.token(T![')'])); } @@ -264,17 +259,14 @@ where let Some(orig) = ctx.sema.original_range_opt(name_ref.syntax()) else { continue }; let name_range = cover_edit_range(source.syntax(), orig.range); - if let Some(colon) = next_non_trivia_token(name_range.end().clone()) + if let Some(colon) = name_range.end().next_non_trivia_token() && colon.kind() == T![:] { editor.delete(&colon); - editor.delete_all(name_range); - - if let Some(next) = next_non_trivia_token(colon.clone()) - && next.kind() != T!['}'] - { - // Avoid overlapping delete whitespace on `{ field: }` - delete_whitespace(editor, colon.next_token()); + if name_range.start() == name_range.end() { + editor.delete_keeping_leading(name_range.start().clone()) + } else { + editor.delete_all(name_range) } } } @@ -315,21 +307,23 @@ fn edit_field_references( } } -fn delete_whitespace(edit: &SyntaxEditor, whitespace: Option) { - let Some(whitespace) = whitespace else { return }; - let NodeOrToken::Token(token) = whitespace.syntax_element() else { return }; - - if token.kind() == SyntaxKind::WHITESPACE && !token.text().contains('\n') { - edit.delete(token); +fn strip_inline_space(edit: &SyntaxEditor, token: Option) { + if let Some(token) = token + && token.trailing_trivia().all(|it| it.kind() != SyntaxKind::NEWLINE) + { + edit.strip_trailing_blank_trivia(&token); } } fn remove_trailing_comma(w: ast::WhereClause) -> SyntaxNode { let (editor, w) = SyntaxEditor::new(w.syntax().clone()); - if let Some(last) = w.last_child_or_token() - && last.kind() == T![,] - { - editor.delete(last); + match w.last_child_or_token() { + Some(last) if last.kind() == T![,] => editor.delete(last), + _ => { + if let Some(last) = w.last_non_trivia_token() { + editor.strip_trailing_blank_trivia(&last); + } + } } editor.finish().new_root().clone() } @@ -750,7 +744,6 @@ where struct Wrap(T) where T: Display; - "#, ); } diff --git a/crates/ide-assists/src/handlers/convert_nested_function_to_closure.rs b/crates/ide-assists/src/handlers/convert_nested_function_to_closure.rs index d0e82d69eb51..0dd7d0b6201e 100644 --- a/crates/ide-assists/src/handlers/convert_nested_function_to_closure.rs +++ b/crates/ide-assists/src/handlers/convert_nested_function_to_closure.rs @@ -38,7 +38,7 @@ pub(crate) fn convert_nested_function_to_closure( return None; } - let target = function.syntax().text_range(); + let target = function.syntax().text_range_without_outer_trivia(); let body = function.body()?; let name = function.name()?; let param_list = function.param_list()?; @@ -48,7 +48,7 @@ pub(crate) fn convert_nested_function_to_closure( "Convert nested function to closure", target, |edit| { - let params = ¶m_list.syntax().text().to_string(); + let params = ¶m_list.syntax().text_without_outer_trivia().to_string(); let params = params.strip_prefix('(').unwrap_or(params); let params = params.strip_suffix(')').unwrap_or(params); diff --git a/crates/ide-assists/src/handlers/convert_range_for_to_while.rs b/crates/ide-assists/src/handlers/convert_range_for_to_while.rs index ae8f626c5da8..7d178fcc4f58 100644 --- a/crates/ide-assists/src/handlers/convert_range_for_to_while.rs +++ b/crates/ide-assists/src/handlers/convert_range_for_to_while.rs @@ -1,10 +1,7 @@ use ide_db::assists::AssistId; use itertools::Itertools; use syntax::{ - AstNode, SyntaxElement, - SyntaxKind::WHITESPACE, - T, - algo::previous_non_trivia_token, + AstNode, SyntaxElement, T, ast::{ self, HasArgList, HasLoopBody, HasName, RangeItem, edit::AstNodeEdit, syntax_factory::SyntaxFactory, @@ -12,7 +9,10 @@ use syntax::{ syntax_editor::{Element, Position, SyntaxEditor}, }; -use crate::assist_context::{AssistContext, Assists}; +use crate::{ + assist_context::{AssistContext, Assists}, + utils::insert_before_with_separator, +}; // Assist: convert_range_for_to_while // @@ -58,18 +58,17 @@ pub(crate) fn convert_range_for_to_while( acc.add( AssistId::refactor("convert_range_for_to_while"), description, - for_.syntax().text_range(), + for_.syntax().text_range_without_outer_trivia(), |builder| { let make = editor.make(); let indent = for_.indent_level(); let pat = make.ident_pat(pat.ref_token().is_some(), true, name.clone()); let let_stmt = make.let_stmt(pat.into(), None, Some(start)); - editor.insert_all( - Position::before(for_.syntax()), - vec![ - let_stmt.syntax().syntax_element(), - make.whitespace(&format!("\n{}", indent)).syntax_element(), - ], + insert_before_with_separator( + &editor, + for_.syntax(), + let_stmt.syntax(), + &format!("\n{}", indent), ); let mut elements = vec![]; @@ -82,8 +81,10 @@ pub(crate) fn convert_range_for_to_while( if let Some(end) = end { elements.extend([ make.token(T![while]).syntax_element(), - make.whitespace(" ").syntax_element(), - make.expr_bin(var_expr.clone(), op, end).syntax().syntax_element(), + make.with_leading_trivia( + make.expr_bin(var_expr.clone(), op, end).syntax(), + " ", + ), ]); } else { elements.push(make.token(T![loop]).syntax_element()); @@ -96,8 +97,10 @@ pub(crate) fn convert_range_for_to_while( let op = ast::BinaryOp::Assignment { op: Some(ast::ArithOp::Add) }; let incrementer = vec![ - make.whitespace(&format!("\n{}", indent + 1)).syntax_element(), - make.expr_bin(var_expr, op, step).syntax().syntax_element(), + make.with_leading_trivia( + make.expr_bin(var_expr, op, step).syntax(), + &format!("\n{}", indent + 1), + ), make.token(T![;]).syntax_element(), ]; process_loop_body(body, label, &editor, incrementer); @@ -132,7 +135,7 @@ fn process_loop_body( incrementer: Vec, ) -> Option<()> { let make = editor.make(); - let last = previous_non_trivia_token(body.r_curly_token()?)?.syntax_element(); + let last = body.r_curly_token()?.prev_non_trivia_token()?.syntax_element(); let new_body = body.indent(1.into()); let mut continues = vec![]; @@ -148,10 +151,8 @@ fn process_loop_body( return Some(()); } - let mut children = body - .syntax() - .children_with_tokens() - .filter(|it| !matches!(it.kind(), WHITESPACE | T!['{'] | T!['}'])); + let mut children = + body.syntax().children_with_tokens().filter(|it| !matches!(it.kind(), T!['{'] | T!['}'])); let first = children.next()?; let block_content = first.clone()..=children.last().unwrap_or(first); @@ -161,13 +162,12 @@ fn process_loop_body( for continue_expr in &continues { new_edit.replace(continue_expr.syntax(), break_expr.syntax()); } - let new_body = new_edit.finish().new_root().clone(); + let new_body = make.with_trailing_trivia(new_edit.finish().new_root(), ""); let elements = itertools::chain( [ continue_label.syntax().syntax_element(), - make.token(T![:]).syntax_element(), - make.whitespace(" ").syntax_element(), - new_body.syntax_element(), + make.with_trailing_trivia(make.token(T![:]), " "), + new_body, ], incrementer, ); diff --git a/crates/ide-assists/src/handlers/convert_to_guarded_return.rs b/crates/ide-assists/src/handlers/convert_to_guarded_return.rs index 74392ca7c14f..501c9a46859f 100644 --- a/crates/ide-assists/src/handlers/convert_to_guarded_return.rs +++ b/crates/ide-assists/src/handlers/convert_to_guarded_return.rs @@ -4,9 +4,7 @@ use either::Either; use hir::Semantics; use ide_db::{RootDatabase, ty_filter::TryEnum}; use syntax::{ - AstNode, - SyntaxKind::WHITESPACE, - SyntaxNode, T, + AstNode, SyntaxElement, SyntaxKind, SyntaxNode, T, ast::{ self, edit::{AstNodeEdit, IndentLevel}, @@ -78,7 +76,7 @@ fn if_expr_to_guarded_return( let cond = if_expr.condition()?; let if_token_range = if_expr.if_token()?.text_range(); - let if_cond_range = cond.syntax().text_range(); + let if_cond_range = cond.syntax().text_range_without_outer_trivia(); let cursor_in_range = if_token_range.cover(if_cond_range).contains_range(ctx.selection_trimmed()); @@ -115,13 +113,8 @@ fn if_expr_to_guarded_return( let then_block_items = then_block.dedent(IndentLevel(1)); let end_of_then = then_block_items.syntax().last_child_or_token()?; - let end_of_then = if end_of_then.prev_sibling_or_token().map(|n| n.kind()) == Some(WHITESPACE) { - end_of_then.prev_sibling_or_token()? - } else { - end_of_then - }; - let target = if_expr.syntax().text_range(); + let target = if_expr.syntax().text_range_without_outer_trivia(); acc.add( AssistId::refactor_rewrite("convert_to_guarded_return"), "Convert to guarded return", @@ -152,22 +145,27 @@ fn if_expr_to_guarded_return( }); let newline = &format!("\n{if_indent_level}"); - let then_statements = replacement - .enumerate() - .flat_map(|(i, node)| { - (i != 0) - .then(|| make.whitespace(newline).into()) - .into_iter() - .chain(node.children_with_tokens()) - }) - .chain( - then_block_items - .syntax() - .children_with_tokens() - .skip(1) - .take_while(|i| *i != end_of_then), - ) - .collect(); + let mut then_statements: Vec = Vec::new(); + for (i, node) in replacement.enumerate() { + let start = then_statements.len(); + then_statements.extend(node.children_with_tokens()); + if i != 0 + && let Some(first) = then_statements.get(start) + { + then_statements[start] = make.with_leading_trivia(first, newline); + } + } + let start = then_statements.len(); + then_statements.extend( + then_block_items + .syntax() + .children_with_tokens() + .skip(1) + .take_while(|i| *i != end_of_then), + ); + if let Some(first) = then_statements.get(start) { + then_statements[start] = make.prepend_leading_trivia(first, "\n"); + } editor.replace_with_many(if_expr.syntax(), then_statements); edit.add_file_edits(ctx.vfs_file_id(), editor); }, @@ -183,7 +181,7 @@ fn let_stmt_to_guarded_return( let expr = let_stmt.initializer()?; let let_token_range = let_stmt.let_token()?.text_range(); - let let_pattern_range = pat.syntax().text_range(); + let let_pattern_range = pat.syntax().text_range_without_outer_trivia(); let cursor_in_range = let_token_range.cover(let_pattern_range).contains_range(ctx.selection_trimmed()); @@ -195,7 +193,7 @@ fn let_stmt_to_guarded_return( ctx.sema.type_of_expr(&expr).and_then(|ty| TryEnum::from_ty(&ctx.sema, &ty.adjusted()))?; let happy_pattern = try_enum.happy_pattern(pat); - let target = let_stmt.syntax().text_range(); + let target = let_stmt.syntax().text_range_without_outer_trivia(); let parent_block = let_stmt.syntax().parent()?.ancestors().find_map(ast::BlockExpr::cast)?; let container = container_of(&parent_block)?; @@ -282,7 +280,10 @@ impl<'db> ElseBlock<'db> { let Some(last_element) = tail_expr.clone().or(last_stmt.clone()) else { return make.tail_only_block_expr(self.kind.make_early_expr(sema, make, None)); }; - let whitespace = last_element.prev_sibling_or_token().filter(|it| it.kind() == WHITESPACE); + let leading: String = last_element + .first_non_trivia_token() + .map(|it| it.leading_trivia().map(|it| it.text().to_owned()).collect()) + .unwrap_or_default(); if let Some(tail_expr) = block_expr.tail_expr() && !self.kind.is_unit() @@ -294,13 +295,14 @@ impl<'db> ElseBlock<'db> { Some(expr) if !expr.is_block_like() => make.expr_stmt(expr).syntax().clone(), _ => last_element.clone(), }; - let whitespace = - make.whitespace(&whitespace.map_or(String::new(), |it| it.to_string())); - let early_expr = self.kind.make_early_expr(sema, make, None).syntax().clone().into(); - editor.replace_with_many( - last_element, - vec![last_stmt.into(), whitespace.into(), early_expr], - ); + let ends_line = last_stmt + .last_non_trivia_token() + .and_then(|it| it.trailing_trivia().last()) + .is_some_and(|it| it.kind() == SyntaxKind::NEWLINE); + let separator = if ends_line { leading } else { format!("\n{leading}") }; + let early_expr = self.kind.make_early_expr(sema, make, None); + let early_expr = make.with_leading_trivia(early_expr.syntax(), &separator); + editor.replace_with_many(last_element, vec![last_stmt.into(), early_expr]); } ast::BlockExpr::cast(editor.finish().new_root().clone()).unwrap() diff --git a/crates/ide-assists/src/handlers/convert_tuple_return_type_to_struct.rs b/crates/ide-assists/src/handlers/convert_tuple_return_type_to_struct.rs index 46e2917f72f1..05c2c6a66f57 100644 --- a/crates/ide-assists/src/handlers/convert_tuple_return_type_to_struct.rs +++ b/crates/ide-assists/src/handlers/convert_tuple_return_type_to_struct.rs @@ -66,7 +66,7 @@ pub(crate) fn convert_tuple_return_type_to_struct( let fn_name = fn_.name()?; let target_module = ctx.sema.scope(fn_.syntax())?.module().nearest_non_block_module(ctx.db()); - let target = type_ref.syntax().text_range(); + let target = type_ref.syntax().text_range_without_outer_trivia(); acc.add( AssistId::refactor_rewrite("convert_tuple_return_type_to_struct"), "Convert tuple return type to tuple struct", @@ -258,7 +258,10 @@ fn add_tuple_struct_def( let indent = IndentLevel::from_node(parent); let struct_def = struct_def.indent(indent); - edit.insert(parent.text_range().start(), format!("{struct_def}\n\n{indent}")); + edit.insert( + parent.text_range_without_outer_trivia().start(), + format!("{struct_def}\n\n{indent}"), + ); } /// Replaces each returned tuple in `body` with the constructor of the tuple struct named `struct_name`. diff --git a/crates/ide-assists/src/handlers/convert_tuple_struct_to_named_struct.rs b/crates/ide-assists/src/handlers/convert_tuple_struct_to_named_struct.rs index 0bb9bf12b12c..d1fe0f1fc608 100644 --- a/crates/ide-assists/src/handlers/convert_tuple_struct_to_named_struct.rs +++ b/crates/ide-assists/src/handlers/convert_tuple_struct_to_named_struct.rs @@ -5,13 +5,12 @@ use ide_db::{ }; use syntax::{ SyntaxKind, T, - algo::{next_non_trivia_token, previous_non_trivia_token}, ast::{ self, AstNode, HasArgList, HasAttrs, HasGenericParams, HasVisibility, syntax_factory::SyntaxFactory, }, match_ast, - syntax_editor::{Element, Position, SyntaxEditor}, + syntax_editor::{Position, SyntaxEditor}, }; use crate::{ @@ -67,7 +66,7 @@ pub(crate) fn convert_tuple_struct_to_named_struct( .or_else(|| ctx.find_node_at_offset::().map(Either::Right))?; let field_list = strukt_or_variant.as_ref().either(|s| s.field_list(), |v| v.field_list())?; - if ctx.offset() > field_list.syntax().text_range().start() { + if ctx.offset() > field_list.syntax().text_range_without_outer_trivia().start() { // Assist could be distracting after the braces return None; } @@ -109,35 +108,36 @@ fn edit_struct_def( SyntaxEditor::with_ast_node(&make.record_field(f.visibility(), name, f.ty()?)); field_editor.insert_all( Position::first_child_of(field.syntax()), - f.attrs().map(|attr| attr.syntax().clone().into()).collect(), + f.attrs() + .map(|attr| field_editor.make().with_trailing_trivia(attr.syntax(), "")) + .collect(), ); ast::RecordField::cast(field_editor.finish().new_root().clone()) }); let record_fields = make.record_field_list(record_fields); - let tuple_fields_before = Position::before(tuple_fields.syntax()); + let mut leading = " "; if let Either::Left(strukt) = strukt { if let Some(w) = strukt.where_clause() { editor.delete(w.syntax()); - let mut insert_element = Vec::new(); - insert_element.push(make.whitespace("\n").syntax_element()); - insert_element.push(w.syntax().syntax_element()); - if w.syntax().last_token().is_none_or(|t| t.kind() != SyntaxKind::COMMA) { - insert_element.push(make.token(T![,]).into()); - } - insert_element.push(make.whitespace("\n").syntax_element()); - editor.insert_all(tuple_fields_before, insert_element); - } else { - editor.insert(tuple_fields_before, make.whitespace(" ")); + let where_clause = make.with_leading_trivia(w.syntax(), "\n"); + let insert_element = + if w.syntax().last_non_trivia_token().is_none_or(|t| t.kind() != SyntaxKind::COMMA) + { + vec![where_clause, make.with_trailing_trivia(make.token(T![,]), "\n")] + } else { + vec![make.with_trailing_trivia(where_clause, "\n")] + }; + editor.insert_all(Position::before(tuple_fields.syntax()), insert_element); + leading = ""; } if let Some(t) = strukt.semicolon_token() { - editor.delete(t); + editor.delete_keeping_edges(t); } - } else { - editor.insert(tuple_fields_before, make.whitespace(" ")); } - editor.replace(tuple_fields.syntax(), record_fields.syntax()); + editor + .replace(tuple_fields.syntax(), make.with_leading_trivia(record_fields.syntax(), leading)); } fn edit_struct_references( @@ -195,8 +195,7 @@ fn process_struct_name_reference( let place = cover_edit_range(source.syntax(), range); let elements = vec![ make.name_ref(name.text()).syntax().clone().into(), - make.token(T![:]).into(), - make.whitespace(" ").into(), + make.with_trailing_trivia(make.token(T![:]), " "), ]; if first_insert.is_empty() { // XXX: SyntaxEditor cannot insert after deleted element @@ -211,8 +210,7 @@ fn process_struct_name_reference( let mut trailing_insert = vec![]; if let Some(rest_pat) = rest_pat { if !first_insert.is_empty() { - trailing_insert.push(make.token(T![,]).into()); - trailing_insert.push(make.whitespace(" ").into()); + trailing_insert.push(make.with_trailing_trivia(make.token(T![,]), " ")); } trailing_insert.push(make.rest_pat().syntax().clone().into()); delete_rest_pat(ctx, source, editor, &rest_pat); @@ -238,8 +236,7 @@ fn process_struct_name_reference( let place = cover_edit_range(source.syntax(), range); let elements = vec![ make.name_ref(name.text()).syntax().clone().into(), - make.token(T![:]).into(), - make.whitespace(" ").into(), + make.with_trailing_trivia(make.token(T![:]), " "), ]; if first_insert.is_empty() { // XXX: SyntaxEditor cannot insert after deleted element @@ -270,31 +267,28 @@ fn process_delimiter( let make = editor.make(); if l_paren.kind() == T!['('] { let mut open_delim = vec![ - make.whitespace(" ").into(), - make.token(T!['{']).into(), - make.whitespace(" ").into(), + make.with_trailing_trivia(make.with_leading_trivia(make.token(T!['{']), " "), " "), ]; open_delim.extend(first_insert); editor.replace_with_many(l_paren, open_delim); } if r_paren.kind() == T![')'] { let mut close_delim = trailing_insert; - close_delim.push(make.whitespace(" ").into()); - close_delim.push(make.token(T!['}']).into()); + close_delim.push(make.with_leading_trivia(make.token(T!['}']), " ")); editor.replace_with_many(r_paren, close_delim); } } fn first_token_of(elem: syntax::SyntaxElement) -> Option { match elem { - syntax::NodeOrToken::Node(node) => node.first_token(), + syntax::NodeOrToken::Node(node) => node.first_non_trivia_token(), syntax::NodeOrToken::Token(t) => Some(t), } } fn last_token_of(elem: syntax::SyntaxElement) -> Option { match elem { - syntax::NodeOrToken::Node(node) => node.last_token(), + syntax::NodeOrToken::Node(node) => node.last_non_trivia_token(), syntax::NodeOrToken::Token(t) => Some(t), } } @@ -307,8 +301,7 @@ fn tuple_struct_pat_parens( pat: &ast::TupleStructPat, ) -> Option<(syntax::SyntaxToken, syntax::SyntaxToken)> { let path_range = ctx.sema.original_range_opt(pat.path()?.syntax())?.range; - let l_paren = - next_non_trivia_token(cover_edit_range(source.syntax(), path_range).end().clone())?; + let l_paren = cover_edit_range(source.syntax(), path_range).end().next_non_trivia_token()?; let pat_range = ctx.sema.original_range_opt(pat.syntax())?.range; let r_paren = last_token_of(cover_edit_range(source.syntax(), pat_range).end().clone())?; @@ -327,12 +320,9 @@ fn delete_rest_pat( let place = cover_edit_range(source.syntax(), range); editor.delete_all(place.clone()); - let following = next_non_trivia_token(place.end().clone()).filter(|t| t.kind() == T![,]); - let preceding = previous_non_trivia_token(place.start().clone()).filter(|t| t.kind() == T![,]); + let following = place.end().next_non_trivia_token().filter(|t| t.kind() == T![,]); + let preceding = place.start().prev_non_trivia_token().filter(|t| t.kind() == T![,]); if let Some(comma) = following.or(preceding) { - if let Some(ws) = comma.next_token().filter(|t| t.kind() == SyntaxKind::WHITESPACE) { - editor.delete(ws); - } editor.delete(comma); } Some(()) diff --git a/crates/ide-assists/src/handlers/convert_while_to_loop.rs b/crates/ide-assists/src/handlers/convert_while_to_loop.rs index 94920569a080..a4a7a3290fec 100644 --- a/crates/ide-assists/src/handlers/convert_while_to_loop.rs +++ b/crates/ide-assists/src/handlers/convert_while_to_loop.rs @@ -45,7 +45,7 @@ pub(crate) fn convert_while_to_loop(acc: &mut Assists, ctx: &AssistContext<'_, ' let while_cond = while_expr.condition()?; let l_curly = while_body.stmt_list()?.l_curly_token()?; - let target = while_expr.syntax().text_range(); + let target = while_expr.syntax().text_range_without_outer_trivia(); acc.add( AssistId::refactor_rewrite("convert_while_to_loop"), "Convert while to loop", @@ -76,19 +76,17 @@ pub(crate) fn convert_while_to_loop(acc: &mut Assists, ctx: &AssistContext<'_, ' } else { let if_cond = invert_boolean_expression(make, while_cond); let if_expr = make.expr_if(if_cond, break_block, None).indent(while_indent_level); - if !while_body.syntax().text().contains_char('\n') { - editor.insert( - Position::after(&l_curly), - make.whitespace(&format!("\n{while_indent_level}")), - ); - } - editor.insert_all( - Position::after(&l_curly), - vec![ - make.whitespace(&format!("\n{}", while_indent_level + 1)).into(), - if_expr.syntax().syntax_element(), - ], + let mut if_expr = make.with_leading_trivia( + if_expr.syntax(), + &format!("\n{}", while_indent_level + 1), ); + if !while_body.syntax().text_without_outer_trivia().contains_char('\n') { + if_expr = make.with_trailing_trivia(if_expr, "\n"); + if let Some(next) = l_curly.next_non_trivia_token() { + editor.prepend_leading_trivia(next, &while_indent_level.to_string()); + } + } + editor.insert(Position::after(&l_curly), if_expr); }; builder.add_file_edits(ctx.vfs_file_id(), editor); }, diff --git a/crates/ide-assists/src/handlers/destructure_struct_binding.rs b/crates/ide-assists/src/handlers/destructure_struct_binding.rs index 2b5b2ca13bb4..35fee27c48c7 100644 --- a/crates/ide-assists/src/handlers/destructure_struct_binding.rs +++ b/crates/ide-assists/src/handlers/destructure_struct_binding.rs @@ -57,7 +57,7 @@ pub(crate) fn destructure_struct_binding( acc.add( AssistId::refactor_rewrite("destructure_struct_binding"), "Destructure struct binding", - data.target.syntax().text_range(), + data.target.syntax().text_range_without_outer_trivia(), |edit| destructure_struct_binding_impl(ctx, edit, &data), ); @@ -164,12 +164,11 @@ impl StructEditData { } Target::SelfParam { insert_after, .. } => { let indent = IndentLevel::from_token(insert_after) + 1; - let newline = make.whitespace(&format!("\n{indent}")); let initializer = make.expr_path(make.ident_path("self")); let let_stmt = make.let_stmt(new_pat, None, Some(initializer)); - editor.insert_all( + editor.insert( Position::after(insert_after), - vec![newline.into(), let_stmt.syntax().clone().into()], + make.with_leading_trivia(let_stmt.syntax(), &format!("\n{indent}")), ); } } diff --git a/crates/ide-assists/src/handlers/destructure_tuple_binding.rs b/crates/ide-assists/src/handlers/destructure_tuple_binding.rs index a272351e134c..c68fe979fa28 100644 --- a/crates/ide-assists/src/handlers/destructure_tuple_binding.rs +++ b/crates/ide-assists/src/handlers/destructure_tuple_binding.rs @@ -71,7 +71,7 @@ pub(crate) fn destructure_tuple_binding_impl( acc.add( AssistId::refactor_rewrite("destructure_tuple_binding_in_sub_pattern"), "Destructure tuple in sub-pattern", - data.ident_pat.syntax().text_range(), + data.ident_pat.syntax().text_range_without_outer_trivia(), |edit| destructure_tuple_edit_impl(ctx, edit, &data, true), ); } @@ -79,7 +79,7 @@ pub(crate) fn destructure_tuple_binding_impl( acc.add( AssistId::refactor_rewrite("destructure_tuple_binding"), if with_sub_pattern { "Destructure tuple in place" } else { "Destructure tuple" }, - data.ident_pat.syntax().text_range(), + data.ident_pat.syntax().text_range_without_outer_trivia(), |edit| destructure_tuple_edit_impl(ctx, edit, &data, false), ); @@ -227,8 +227,10 @@ impl AssignmentEdit { if self.in_sub_pattern { self.ident_pat.set_pat(Some(self.tuple_pat.into()), editor); } else if self.is_shorthand_field { - editor.insert(Position::after(self.ident_pat.syntax()), self.tuple_pat.syntax()); - editor.insert(Position::after(self.ident_pat.syntax()), make.whitespace(" ")); + editor.insert( + Position::after(self.ident_pat.syntax()), + make.with_leading_trivia(self.tuple_pat.syntax(), " "), + ); editor.insert(Position::after(self.ident_pat.syntax()), make.token(T![:])); } else { editor.replace(self.ident_pat.syntax(), self.tuple_pat.syntax()) diff --git a/crates/ide-assists/src/handlers/desugar_doc_comment.rs b/crates/ide-assists/src/handlers/desugar_doc_comment.rs index b0657ef43409..193b005c081f 100644 --- a/crates/ide-assists/src/handlers/desugar_doc_comment.rs +++ b/crates/ide-assists/src/handlers/desugar_doc_comment.rs @@ -1,8 +1,12 @@ +use std::iter::successors; + use either::Either; use itertools::Itertools; use syntax::{ - AstNode, AstToken, TextRange, - ast::{self, AttrKind, Whitespace, edit::IndentLevel}, + AstNode, AstToken, + SyntaxKind::{NEWLINE, WHITESPACE}, + TextRange, + ast::{self, AttrKind, edit::IndentLevel}, }; use crate::{ @@ -30,14 +34,23 @@ pub(crate) fn desugar_doc_comment(acc: &mut Assists, ctx: &AssistContext<'_, '_> let placement = comment.kind(); // Only allow comments which are alone on their line - if let Some(prev) = comment.syntax().first_token().and_then(|it| it.prev_token()) { - Whitespace::cast(prev).filter(|w| w.text().contains('\n'))?; + if comment + .syntax() + .first_non_trivia_token() + .and_then(|it| { + successors(it.prev_token(), |it| it.prev_token()).find(|it| it.kind() != WHITESPACE) + }) + .is_some_and(|it| it.kind() != NEWLINE) + { + return None; } let indentation = IndentLevel::from_node(comment.syntax()).to_string(); let (target, comments) = match comment.shape() { - ast::CommentShape::Block => (comment.syntax().text_range(), Either::Left(comment)), + ast::CommentShape::Block => { + (comment.syntax().text_range_without_outer_trivia(), Either::Left(comment)) + } ast::CommentShape::Line => { // Find all the comments we'll be desugaring let comments = relevant_line_comments(&comment.token()); diff --git a/crates/ide-assists/src/handlers/desugar_try_expr.rs b/crates/ide-assists/src/handlers/desugar_try_expr.rs index 5e1cd7700da3..d34e6a9ea7f3 100644 --- a/crates/ide-assists/src/handlers/desugar_try_expr.rs +++ b/crates/ide-assists/src/handlers/desugar_try_expr.rs @@ -59,7 +59,7 @@ pub(crate) fn desugar_try_expr(acc: &mut Assists, ctx: &AssistContext<'_, '_>) - let try_enum = TryEnum::from_ty(&ctx.sema, &expr_type_info.original)?; - let target = try_expr.syntax().text_range(); + let target = try_expr.syntax().text_range_without_outer_trivia(); acc.add( AssistId::refactor_rewrite("desugar_try_expr_match"), "Replace try expression with match", diff --git a/crates/ide-assists/src/handlers/expand_rest_pattern.rs b/crates/ide-assists/src/handlers/expand_rest_pattern.rs index 8ae322c02003..2a889bb4602a 100644 --- a/crates/ide-assists/src/handlers/expand_rest_pattern.rs +++ b/crates/ide-assists/src/handlers/expand_rest_pattern.rs @@ -49,7 +49,7 @@ fn expand_record_rest_pattern( acc.add( AssistId::refactor_rewrite("expand_record_rest_pattern"), "Fill struct fields", - rest_pat.syntax().text_range(), + rest_pat.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(rest_pat.syntax()); let make = editor.make(); @@ -126,7 +126,7 @@ fn expand_tuple_struct_rest_pattern( acc.add( AssistId::refactor_rewrite("expand_tuple_struct_rest_pattern"), "Fill tuple struct fields", - rest_pat.syntax().text_range(), + rest_pat.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(rest_pat.syntax()); let make = editor.make(); @@ -188,7 +188,7 @@ fn expand_tuple_rest_pattern( acc.add( AssistId::refactor_rewrite("expand_tuple_rest_pattern"), "Fill tuple fields", - rest_pat.syntax().text_range(), + rest_pat.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(rest_pat.syntax()); let make = editor.make(); @@ -249,7 +249,7 @@ fn expand_slice_rest_pattern( acc.add( AssistId::refactor_rewrite("expand_slice_rest_pattern"), "Fill slice fields", - rest_pat.syntax().text_range(), + rest_pat.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(rest_pat.syntax()); let make = editor.make(); diff --git a/crates/ide-assists/src/handlers/extract_expressions_from_format_string.rs b/crates/ide-assists/src/handlers/extract_expressions_from_format_string.rs index 178477c74605..30f3edd817ba 100644 --- a/crates/ide-assists/src/handlers/extract_expressions_from_format_string.rs +++ b/crates/ide-assists/src/handlers/extract_expressions_from_format_string.rs @@ -5,9 +5,7 @@ use ide_db::{ }; use itertools::Itertools; use syntax::{ - AstNode, AstToken, NodeOrToken, - SyntaxKind::WHITESPACE, - SyntaxToken, T, + AstNode, AstToken, NodeOrToken, SyntaxToken, T, ast::{self, TokenTree}, }; @@ -55,7 +53,7 @@ pub(crate) fn extract_expressions_from_format_string( None, ), "Extract format expressions", - tt.syntax().text_range(), + tt.syntax().text_range_without_outer_trivia(), |edit| { let editor = edit.make_editor(tt.syntax()); let make = editor.make(); @@ -71,20 +69,8 @@ pub(crate) fn extract_expressions_from_format_string( NodeOrToken::Token(_end_bracket), ] = tokens.as_slice() { - let args = tokens - .split(|it| matches!(it, NodeOrToken::Token(t) if t.kind() == T![,])) - .map(|arg| { - // Strip off leading and trailing whitespace tokens - let arg = match arg.split_first() { - Some((NodeOrToken::Token(t), rest)) if t.kind() == WHITESPACE => rest, - _ => arg, - }; - - match arg.split_last() { - Some((NodeOrToken::Token(t), rest)) if t.kind() == WHITESPACE => rest, - _ => arg, - } - }); + let args = + tokens.split(|it| matches!(it, NodeOrToken::Token(t) if t.kind() == T![,])); args.collect() } else { @@ -101,10 +87,8 @@ pub(crate) fn extract_expressions_from_format_string( for arg in extracted_args { if matches!(arg, Arg::Expr(_) | Arg::Placeholder) { // insert ", " before each arg - new_tt_bits.extend_from_slice(&[ - NodeOrToken::Token(make.token(T![,])), - NodeOrToken::Token(make.whitespace(" ")), - ]); + let separator = make.with_trailing_trivia(make.token(T![,]), " "); + new_tt_bits.extend(separator.into_token().map(NodeOrToken::Token)); } match arg { @@ -121,7 +105,14 @@ pub(crate) fn extract_expressions_from_format_string( new_tt_bits.extend_from_slice(arg); } None => { - placeholder_indexes.push(new_tt_bits.len()); + placeholder_indexes.push( + new_tt_bits + .iter() + .filter(|it| { + matches!(it, NodeOrToken::Token(t) if t.kind() == T![_]) + }) + .count(), + ); new_tt_bits.push(NodeOrToken::Token(make.token(T![_]))); } } @@ -137,17 +128,16 @@ pub(crate) fn extract_expressions_from_format_string( if let Some(cap) = ctx.config.snippet_cap { // Add placeholder snippets over placeholder args for pos in placeholder_indexes { - // Skip the opening delimiter - let Some(NodeOrToken::Token(placeholder)) = - new_tt.token_trees_and_tokens().skip(1).nth(pos) + let Some(NodeOrToken::Token(placeholder)) = new_tt + .token_trees_and_tokens() + .filter(|it| matches!(it, NodeOrToken::Token(t) if t.kind() == T![_])) + .nth(pos) else { continue; }; - if stdx::always!(placeholder.kind() == T![_]) { - let annotation = edit.make_placeholder_snippet(cap); - editor.add_annotation(placeholder, annotation); - } + let annotation = edit.make_placeholder_snippet(cap); + editor.add_annotation(placeholder, annotation); } // Add the final tabstop after the format literal diff --git a/crates/ide-assists/src/handlers/extract_function.rs b/crates/ide-assists/src/handlers/extract_function.rs index 038d100e621e..cf470b9aa840 100644 --- a/crates/ide-assists/src/handlers/extract_function.rs +++ b/crates/ide-assists/src/handlers/extract_function.rs @@ -19,16 +19,14 @@ use ide_db::{ }; use itertools::Itertools; use syntax::{ - Edition, SyntaxElement, - SyntaxKind::{self, COMMENT}, - SyntaxNode, T, TextRange, WalkEvent, + Edition, SyntaxElement, SyntaxKind, SyntaxNode, T, TextRange, WalkEvent, ast::{ self, AstNode, AstToken, HasAttrs, HasGenericParams, HasName, edit::{AstNodeEdit, IndentLevel}, syntax_factory::SyntaxFactory, }, match_ast, - syntax_editor::{Position, SyntaxEditor}, + syntax_editor::{Element, Position, SyntaxEditor}, }; use crate::{ @@ -170,16 +168,10 @@ pub(crate) fn extract_function(acc: &mut Assists, ctx: &AssistContext<'_, '_>) - }; if let Some(cap) = ctx.config.snippet_cap { let extracted_fn = fn_def.descendants().find_map(ast::Fn::cast); - if let Some(fn_) = extracted_fn { - if let Some(ws) = fn_ - .fn_token() - .and_then(|tok| tok.next_token()) - .filter(|tok| tok.kind() == SyntaxKind::WHITESPACE) - { - editor.add_annotation(ws, builder.make_tabstop_after(cap)); - } else if let Some(name) = fn_.name() { - editor.add_annotation(name.syntax(), builder.make_tabstop_before(cap)); - } + if let Some(fn_) = extracted_fn + && let Some(name) = fn_.name() + { + editor.add_annotation(name.syntax(), builder.make_tabstop_before(cap)); } } @@ -225,15 +217,72 @@ pub(crate) fn extract_function(acc: &mut Assists, ctx: &AssistContext<'_, '_>) - if needs_match_arm_comma { replacement.push(make.token(T![,]).into()); } + let selection = ctx.selection_trimmed(); + let (leading, trailing) = + outer_trivia_text(expr.syntax(), expr.syntax(), |it| { + it.text_range().intersect(selection).is_none_or(|it| it.is_empty()) + }); + replacement[0] = make.with_leading_trivia(&replacement[0], &leading); + let last = replacement.len() - 1; + replacement[last] = make.with_trailing_trivia(&replacement[last], &trailing); editor.replace_with_many(expr.syntax(), replacement); } - FunctionBody::Span { .. } => editor.replace_all(elements, vec![call_expr.into()]), + FunctionBody::Span { .. } => { + let blank = |trivia_token: &syntax::SyntaxToken| { + matches!(trivia_token.kind(), SyntaxKind::WHITESPACE | SyntaxKind::NEWLINE) + }; + let leading: String = elements + .start() + .first_non_trivia_token() + .map(|token| { + token + .leading_trivia() + .take_while(blank) + .map(|it| it.text().to_owned()) + .collect() + }) + .unwrap_or_default(); + let trailing: String = elements + .end() + .last_non_trivia_token() + .map(|token| { + let trivia: Vec<_> = token.trailing_trivia().collect(); + let start = trivia + .iter() + .rposition(|it| !blank(it)) + .map_or(0, |index| index + 1); + trivia[start..].iter().map(|it| it.text().to_owned()).collect() + }) + .unwrap_or_default(); + let call = make.with_leading_trivia(&call_expr, &leading); + let call = make.with_trailing_trivia(&call, &trailing); + if let Some(next) = elements + .end() + .last_non_trivia_token() + .and_then(|it| it.next_non_trivia_token()) + { + let selection = ctx.selection_trimmed(); + let trivia: Vec<_> = next.leading_trivia().collect(); + let taken = trivia.iter().rposition(|it| { + it.kind() == SyntaxKind::COMMENT + && it.text_range().intersect(selection).is_some() + }); + if let Some(index) = taken { + let end = trivia[index + 1..] + .iter() + .position(|it| it.kind() == SyntaxKind::NEWLINE) + .map_or(trivia.len(), |offset| index + offset + 2); + editor.splice_leading_trivia(&next, ..end, []); + } + } + editor.replace_all(elements, vec![call]); + } } // Insert the newly extracted function (or impl) - editor.insert_all( + editor.insert( Position::after(insert_after), - vec![make.whitespace(&format!("\n\n{new_indent}")).into(), fn_def.into()], + make.with_leading_trivia(fn_def, &format!("\n\n{new_indent}")), ); builder.add_file_edits(ctx.vfs_file_id(), editor); }, @@ -298,7 +347,7 @@ fn extraction_target(node: &SyntaxNode, selection_range: TextRange) -> Option Some(expr.clone()), FunctionBody::Span { parent, text_range, .. } => { let tail_expr = parent.tail_expr()?; - text_range.contains_range(tail_expr.syntax().text_range()).then_some(tail_expr) + text_range + .contains_range(tail_expr.syntax().text_range_without_outer_trivia()) + .then_some(tail_expr) } } } @@ -707,7 +758,9 @@ impl FunctionBody { FunctionBody::Span { parent, text_range, .. } => { parent .statements() - .filter(|stmt| text_range.contains_range(stmt.syntax().text_range())) + .filter(|stmt| { + text_range.contains_range(stmt.syntax().text_range_without_outer_trivia()) + }) .filter_map(|stmt| match stmt { ast::Stmt::ExprStmt(expr_stmt) => expr_stmt.expr().map(|e| vec![e]), ast::Stmt::Item(_) => None, @@ -728,10 +781,9 @@ impl FunctionBody { }) .flatten() .for_each(|expr| preorder_expr(&expr, cb)); - if let Some(expr) = parent - .tail_expr() - .filter(|it| text_range.contains_range(it.syntax().text_range())) - { + if let Some(expr) = parent.tail_expr().filter(|it| { + text_range.contains_range(it.syntax().text_range_without_outer_trivia()) + }) { preorder_expr(&expr, cb); } } @@ -744,7 +796,9 @@ impl FunctionBody { FunctionBody::Span { parent, text_range, .. } => { parent .statements() - .filter(|stmt| text_range.contains_range(stmt.syntax().text_range())) + .filter(|stmt| { + text_range.contains_range(stmt.syntax().text_range_without_outer_trivia()) + }) .for_each(|stmt| match stmt { ast::Stmt::ExprStmt(expr_stmt) => { if let Some(expr) = expr_stmt.expr() { @@ -764,10 +818,9 @@ impl FunctionBody { } } }); - if let Some(expr) = parent - .tail_expr() - .filter(|it| text_range.contains_range(it.syntax().text_range())) - { + if let Some(expr) = parent.tail_expr().filter(|it| { + text_range.contains_range(it.syntax().text_range_without_outer_trivia()) + }) { walk_patterns_in_expr(&expr, cb); } } @@ -776,7 +829,7 @@ impl FunctionBody { fn text_range(&self) -> TextRange { match self { - FunctionBody::Expr(expr) => expr.syntax().text_range(), + FunctionBody::Expr(expr) => expr.syntax().text_range_without_outer_trivia(), &FunctionBody::Span { text_range, .. } => text_range, } } @@ -815,7 +868,9 @@ impl FunctionBody { let mut res = FxIndexSet::default(); let (text_range, element) = match self { - FunctionBody::Expr(expr) => (expr.syntax().text_range(), Either::Left(expr)), + FunctionBody::Expr(expr) => { + (expr.syntax().text_range_without_outer_trivia(), Either::Left(expr)) + } FunctionBody::Span { parent, text_range, .. } => (*text_range, Either::Right(parent)), }; @@ -852,10 +907,9 @@ impl FunctionBody { let infer_expr_opt = |expr| sema.type_of_expr(&expr?).map(TypeInfo::adjusted); let mut parent_loop = None; let mut set_parent_loop = |loop_: &dyn ast::HasLoopBody| { - if loop_ - .loop_body() - .is_some_and(|it| it.syntax().text_range().contains_range(self.text_range())) - { + if loop_.loop_body().is_some_and(|it| { + it.syntax().text_range_without_outer_trivia().contains_range(self.text_range()) + }) { parent_loop.get_or_insert(loop_.syntax().clone()); } }; @@ -922,9 +976,9 @@ impl FunctionBody { let expr = expr?; let contains_tail_expr = if let Some(body_tail) = self.tail_expr() { let mut contains_tail_expr = false; - let tail_expr_range = body_tail.syntax().text_range(); + let tail_expr_range = body_tail.syntax().text_range_without_outer_trivia(); for_each_tail_expr(&expr, &mut |e| { - if tail_expr_range.contains_range(e.syntax().text_range()) { + if tail_expr_range.contains_range(e.syntax().text_range_without_outer_trivia()) { contains_tail_expr = true; } }); @@ -1088,10 +1142,11 @@ impl FunctionBody { let usages = LocalUsages::find_local_usages(ctx, var); let ty = var.ty(ctx.db()); - let defined_outside_parent_loop = container_info - .parent_loop - .as_ref() - .is_none_or(|it| it.text_range().contains_range(src.syntax().text_range())); + let defined_outside_parent_loop = + container_info.parent_loop.as_ref().is_none_or(|it| { + it.text_range_without_outer_trivia() + .contains_range(src.syntax().text_range_without_outer_trivia()) + }); let is_copy = ty.is_copy(ctx.db()); let has_usages = self.has_usages_after_body(&usages); @@ -1809,6 +1864,10 @@ fn make_body<'db>( let block = match &fun.body { FunctionBody::Expr(expr) => { + let selection = ctx.selection_trimmed(); + let (leading, trailing) = outer_trivia_text(expr.syntax(), expr.syntax(), |it| { + it.text_range().intersect(selection).is_some_and(|it| !it.is_empty()) + }); let expr = rewrite_body_segment(ctx, to_this_param, &fun.params, &handler, expr.syntax()); let expr = ast::Expr::cast(expr).expect("Body segment should be an expr"); @@ -1819,22 +1878,23 @@ fn make_body<'db>( let elements = block.stmt_list().map_or_else( || Either::Left(iter::empty()), |stmt_list| { - let elements = stmt_list.syntax().children_with_tokens().filter_map( - |node_or_token| match &node_or_token { - syntax::NodeOrToken::Node(node) => { - ast::Stmt::cast(node.clone()).map(|_| node_or_token) - } - syntax::NodeOrToken::Token(token) => { - ast::Comment::cast(token.clone()).map(|_| node_or_token) - } - }, - ); + let elements = stmt_list + .syntax() + .children() + .filter(|node| ast::Stmt::can_cast(node.kind())) + .map(SyntaxElement::from); Either::Right(elements) }, ); make.hacky_block_expr(elements, block.tail_expr()) } _ => { + let expr = make.with_leading_trivia(expr.syntax(), &leading); + let expr = make.with_trailing_trivia(&expr, &trailing); + let expr = expr + .into_node() + .and_then(ast::Expr::cast) + .expect("Body segment should be an expr"); let expr = expr.dedent(old_indent).indent(1.into()); make.block_expr(Vec::new(), Some(expr)) @@ -1842,10 +1902,36 @@ fn make_body<'db>( } } FunctionBody::Span { parent, text_range, .. } => { - let mut elements: Vec<_> = parent + let selected: Vec<_> = parent .syntax() .children_with_tokens() - .filter(|it| text_range.contains_range(it.text_range())) + .filter(|it| text_range.contains_range(it.text_range_without_outer_trivia())) + .collect(); + + let selection = text_range.cover(ctx.selection_trimmed()); + let touched = |trivia_token: &syntax::SyntaxToken| { + trivia_token.text_range().intersect(selection).is_some() + }; + let (leading, trailing) = selected + .first() + .zip(selected.last()) + .map(|(first, last)| outer_trivia_text(first, last, touched)) + .unwrap_or_default(); + let after: Vec = selected + .last() + .and_then(|it| it.last_non_trivia_token()) + .and_then(|token| token.next_non_trivia_token()) + .map(|next| { + next.leading_trivia() + .filter(touched) + .filter(|it| it.kind() == SyntaxKind::COMMENT) + .map(|it| it.text().to_owned()) + .collect() + }) + .unwrap_or_default(); + + let mut elements: Vec<_> = selected + .into_iter() .map(|it| match &it { syntax::NodeOrToken::Node(n) => syntax::NodeOrToken::Node( rewrite_body_segment(ctx, to_this_param.clone(), &fun.params, &handler, n), @@ -1854,6 +1940,14 @@ fn make_body<'db>( }) .collect(); + if let Some(first) = elements.first() { + elements[0] = make.with_leading_trivia(first, &leading); + } + if let Some(last) = elements.last() { + let index = elements.len() - 1; + elements[index] = make.with_trailing_trivia(last, &trailing); + } + let mut tail_expr = match &elements.last() { Some(syntax::NodeOrToken::Node(node)) if ast::Expr::can_cast(node.kind()) => { ast::Expr::cast(node.clone()) @@ -1897,7 +1991,21 @@ fn make_body<'db>( .collect::>(); tail_expr = tail_expr.map(|expr| expr.dedent(old_indent).indent(body_indent)); - make.hacky_block_expr(elements, tail_expr) + let block = make.hacky_block_expr(elements, tail_expr); + if after.is_empty() { + block + } else { + let (editor, block) = SyntaxEditor::with_ast_node(&block); + let anchor = block + .tail_expr() + .and_then(|it| it.syntax().first_non_trivia_token()) + .or_else(|| block.stmt_list().and_then(|it| it.r_curly_token())); + if let Some(anchor) = anchor { + let comments: String = after.iter().map(|it| format!(" {it}\n")).collect(); + editor.prepend_leading_trivia(&anchor, &comments); + } + ast::BlockExpr::cast(editor.finish().new_root().clone()).unwrap() + } } }; @@ -2224,6 +2332,25 @@ fn make_rewritten_flow( Some(make.expr_return(Some(value)).into()) } +fn outer_trivia_text( + first: impl Element, + last: impl Element, + keep: impl Fn(&syntax::SyntaxToken) -> bool, +) -> (String, String) { + let text = |it: syntax::SyntaxToken| it.text().to_owned(); + let leading = first + .syntax_element() + .first_non_trivia_token() + .map(|it| it.leading_trivia().filter(&keep).map(text).collect()) + .unwrap_or_default(); + let trailing = last + .syntax_element() + .last_non_trivia_token() + .map(|it| it.trailing_trivia().filter(&keep).map(text).collect()) + .unwrap_or_default(); + (leading, trailing) +} + #[cfg(test)] mod tests { use crate::tests::{check_assist, check_assist_not_applicable}; diff --git a/crates/ide-assists/src/handlers/extract_module.rs b/crates/ide-assists/src/handlers/extract_module.rs index 9ff07d8dd6d2..a8d42a210e6e 100644 --- a/crates/ide-assists/src/handlers/extract_module.rs +++ b/crates/ide-assists/src/handlers/extract_module.rs @@ -10,9 +10,7 @@ use ide_db::{ use itertools::Itertools; use smallvec::SmallVec; use syntax::{ - AstNode, - SyntaxKind::{self, WHITESPACE}, - SyntaxNode, TextRange, TextSize, + AstNode, SyntaxKind, SyntaxNode, TextRange, TextSize, algo::find_node_at_range, ast::{ self, HasVisibility, @@ -20,7 +18,7 @@ use syntax::{ syntax_factory::SyntaxFactory, }, match_ast, - syntax_editor::{Position, SyntaxEditor}, + syntax_editor::SyntaxEditor, }; use crate::{AssistContext, Assists}; @@ -72,10 +70,13 @@ pub(crate) fn extract_module(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> let selection_range = ctx.selection_trimmed(); let (mut module, module_text_range) = if let Some(item) = ast::Item::cast(node.clone()) { let module = extract_single_target(&item); - (module, node.text_range()) + (module, node.text_range_without_outer_trivia()) } else { let (module, range) = extract_child_target(&node, selection_range)?; - let module_text_range = range.start().text_range().cover(range.end().text_range()); + let module_text_range = range + .start() + .text_range_without_outer_trivia() + .cover(range.end().text_range_without_outer_trivia()); (module, module_text_range) }; if module.body_items.is_empty() { @@ -163,7 +164,7 @@ pub(crate) fn extract_module(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> }; for node_to_be_removed in nodes_to_be_removed { - builder.delete(node_to_be_removed.text_range()); + builder.delete(node_to_be_removed.text_range_without_outer_trivia()); // Remove preceding indentation from node if let Some(range) = indent_range_before_given_node(node_to_be_removed) { builder.delete(range); @@ -171,7 +172,7 @@ pub(crate) fn extract_module(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> } builder.insert( - impl_.syntax().text_range().end(), + impl_.syntax().text_range_without_outer_trivia().end(), format!("\n\n{old_item_indent}{module_def}"), ); } else { @@ -202,7 +203,7 @@ fn generate_module_def( .collect_vec(); let impl_reset = impl_.reset_indent(); let (editor, impl_root) = SyntaxEditor::with_ast_node(&impl_reset); - let assoc_item_list = editor.make().assoc_item_list(assoc_items); + let assoc_item_list = make.assoc_item_list(assoc_items); if let Some(existing_list) = impl_root.assoc_item_list() { editor.replace(existing_list.syntax(), assoc_item_list.syntax()); } @@ -225,7 +226,7 @@ fn generate_module_def( fn make_use_stmt_of_node_with_super(node_syntax: &SyntaxNode, make: &SyntaxFactory) -> ast::Item { let super_path = make.ident_path("super"); - let node_path = make.path_from_text(&node_syntax.to_string()); + let node_path = make.path_from_text(&node_syntax.text_without_outer_trivia().to_string()); let use_ = make.use_( [], None, @@ -262,7 +263,7 @@ fn extract_child_target( ) -> Option<(Module, RangeInclusive)> { let selected_nodes = node .children() - .filter(|node| selection_range.contains_range(node.text_range())) + .filter(|node| selection_range.contains_range(node.text_range_without_outer_trivia())) .filter_map(ast::Item::cast) .collect_vec(); let start = selected_nodes.first()?.syntax().clone(); @@ -375,7 +376,9 @@ impl Module { syntax::NodeOrToken::Node(node) => node, syntax::NodeOrToken::Token(tok) => tok.parent().unwrap(), // won't panic }; - let out_of_sel = |node: &SyntaxNode| !replace_range.contains_range(node.text_range()); + let out_of_sel = |node: &SyntaxNode| { + !replace_range.contains_range(node.text_range_without_outer_trivia()) + }; let mut use_stmts_set = FxHashSet::default(); for (file_id, refs) in node_def.usages(&ctx.sema).all() { @@ -391,9 +394,10 @@ impl Module { // handle usages in use_stmts which is in_sel // check if `use` is top stmt in selection if use_.syntax().parent().is_some_and(|parent| parent == covering_node) - && use_stmts_set.insert(use_.syntax().text_range().start()) + && use_stmts_set + .insert(use_.syntax().text_range_without_outer_trivia().start()) { - let key = use_.syntax().text_range().start(); + let key = use_.syntax().text_range_without_outer_trivia().start(); let entry = use_stmts_to_be_inserted.entry(key).or_insert_with(|| use_.clone()); let (editor, edit_root) = SyntaxEditor::with_ast_node(&*entry); @@ -403,7 +407,10 @@ impl Module { .syntax() .descendants() .filter_map(ast::NameRef::cast) - .filter(|seg| seg.syntax().to_string() == name_ref.to_string()) + .filter(|seg| { + seg.syntax().text_without_outer_trivia().to_string() + == name_ref.to_string() + }) .filter_map(|seg| { Some(( seg.syntax().parent()?, @@ -449,8 +456,9 @@ impl Module { for (_, field_owner) in record_field_parents { for desc in field_owner.descendants().filter_map(ast::RecordField::cast) { - let is_record_field_present = - record_fields.clone().into_iter().any(|x| x.to_string() == desc.to_string()); + let is_record_field_present = record_fields + .iter() + .any(|x| x.text_without_outer_trivia().to_string() == desc.to_string()); if is_record_field_present { replacements.push((desc.visibility(), desc.syntax().clone())); } @@ -484,13 +492,10 @@ impl Module { let (editor, _) = SyntaxEditor::new(body_item.syntax().clone()); for target in insert_targets { - editor.insert_all( - Position::before(target), - vec![ - make.visibility_pub_crate().syntax().clone().into(), - make.whitespace(" ").into(), - ], - ); + let vis = editor + .make() + .with_trailing_trivia(make.visibility_pub_crate().syntax().clone(), " "); + editor.insert_taking_leading(target, vis); } *body_item = ast::Item::cast(editor.finish().new_root().clone()).unwrap(); } @@ -526,7 +531,7 @@ impl Module { } }) .for_each(|(node, def)| { - if node_set.insert(node.to_string()) + if node_set.insert(node.text_without_outer_trivia().to_string()) && let Some(import) = self.process_def_in_sel(def, &node, &module, ctx, make) { @@ -562,7 +567,8 @@ impl Module { .filter(|x| find_node_at_range::(file.syntax(), x.range).is_none()) .filter_map(|x| find_node_at_range::(file.syntax(), x.range)) { - let in_selection = selection_range.contains_range(x.syntax().text_range()); + let in_selection = + selection_range.contains_range(x.syntax().text_range_without_outer_trivia()); uses_exist_in_sel |= in_selection; uses_exist_out_sel |= !in_selection; @@ -587,7 +593,7 @@ impl Module { .flat_map(|(_, refs)| refs.into_iter().rev()) .find_map(|fref| find_node_at_range(file.syntax(), fref.range)); let use_stmt_not_in_sel = use_stmt.as_ref().is_some_and(|use_stmt| { - !selection_range.contains_range(use_stmt.syntax().text_range()) + !selection_range.contains_range(use_stmt.syntax().text_range_without_outer_trivia()) }); let mut use_tree_paths: Option> = None; @@ -697,7 +703,9 @@ impl Module { ) -> Option<(Vec, Option)> { let use_stmt = use_stmt?; for path_seg in use_stmt.syntax().descendants().filter_map(ast::PathSegment::cast) { - if path_seg.syntax().to_string() == node_syntax.to_string() { + if path_seg.syntax().text_without_outer_trivia().to_string() + == node_syntax.text_without_outer_trivia().to_string() + { let mut use_tree_str = vec![path_seg.parent_path()]; get_use_tree_paths_from_path(path_seg.parent_path(), &mut use_tree_str); @@ -706,7 +714,9 @@ impl Module { //then includes it in the text range to remove it. But the comma only //appears at the use_tree level for use_tree in path_seg.syntax().ancestors().filter_map(ast::UseTree::cast) { - if use_tree.syntax().to_string() == node_syntax.to_string() { + if use_tree.syntax().text_without_outer_trivia().to_string() + == node_syntax.text_without_outer_trivia().to_string() + { return Some((use_tree_str, Some(range_to_remove(use_tree.syntax())))); } } @@ -756,7 +766,8 @@ fn check_def_in_mod_and_out_sel( source.file_id.original_file(ctx.db()).file_id(ctx.db()) == curr_file_id }; - let in_sel = !selection_range.contains_range(source.value.syntax().text_range()); + let in_sel = !selection_range + .contains_range(source.value.syntax().text_range_without_outer_trivia()); return (have_same_parent, in_sel); } }; @@ -773,7 +784,8 @@ fn check_def_in_mod_and_out_sel( }; if have_same_parent && let ModuleSource::Module(module_) = source.value { - let in_sel = !selection_range.contains_range(module_.syntax().text_range()); + let in_sel = !selection_range + .contains_range(module_.syntax().text_range_without_outer_trivia()); return (have_same_parent, in_sel); } @@ -862,9 +874,12 @@ fn get_use_tree_paths_from_path( } fn indent_range_before_given_node(node: &SyntaxNode) -> Option { - node.siblings_with_tokens(syntax::Direction::Prev) - .find(|x| x.kind() == WHITESPACE) - .map(|x| x.text_range()) + let start = node + .first_non_trivia_token() + .and_then(|it| it.prev_non_trivia_token()) + .map_or_else(|| node.text_range().start(), |it| it.text_range().end()); + let range = TextRange::new(start, node.text_range_without_outer_trivia().start()); + (!range.is_empty()).then_some(range) } #[cfg(test)] diff --git a/crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs b/crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs index 8d0b9da112c3..430725a01e65 100644 --- a/crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs +++ b/crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs @@ -16,7 +16,8 @@ use syntax::{ SyntaxKind::*, SyntaxNode, T, ast::{ - self, AstNode, HasAttrs, HasGenericParams, HasName, HasVisibility, edit::AstNodeEdit, + self, AstNode, HasAttrs, HasGenericParams, HasName, HasVisibility, + edit::{AstNodeEdit, IndentLevel}, syntax_factory::SyntaxFactory, }, match_ast, @@ -54,7 +55,7 @@ pub(crate) fn extract_struct_from_enum_variant( let enum_ast = variant.parent_enum(); let enum_hir = ctx.sema.to_def(&enum_ast)?; - let target = variant.syntax().text_range(); + let target = variant.syntax().text_range_without_outer_trivia(); acc.add( AssistId::refactor_rewrite("extract_struct_from_enum_variant"), "Extract struct from enum variant", @@ -137,10 +138,12 @@ pub(crate) fn extract_struct_from_enum_variant( field_list.clone() }; - let (comments_for_struct, comments_to_delete) = - collect_variant_comments(make, variant.syntax()); - for element in &comments_to_delete { - editor.delete(element.clone()); + let comments_for_struct = + take_variant_comments(&editor, &variant, IndentLevel::from_node(enum_ast.syntax())); + let docs_for_struct: Vec = + variant.syntax().children().filter_map(ast::DocComment::cast).collect(); + for doc in &docs_for_struct { + editor.delete(doc.syntax()); } let def = create_struct_def( @@ -157,13 +160,16 @@ pub(crate) fn extract_struct_from_enum_variant( let mut insert_items: Vec = Vec::new(); for attr in enum_ast.attrs() { - insert_items.push(attr.syntax().clone().into()); - insert_items.push(make.whitespace("\n").into()); + insert_items.push(make.with_trailing_trivia(attr.syntax(), "\n")); } - insert_items.extend(comments_for_struct); - insert_items.push(def.syntax().clone().into()); - insert_items.push(make.whitespace(&format!("\n\n{indent}")).into()); - editor.insert_all_with_whitespace(Position::before(enum_ast.syntax()), insert_items); + for doc in docs_for_struct { + insert_items.push(make.with_trailing_trivia(doc.syntax(), &format!("\n{indent}"))); + } + insert_items.push(make.with_trailing_trivia(def.syntax(), "\n")); + insert_items[0] = make + .with_leading_trivia(&insert_items[0], &format!("{comments_for_struct}{indent}")); + editor.insert_all(Position::before(enum_ast.syntax()), insert_items); + editor.prepend_leading_trivia(enum_ast.syntax(), "\n"); update_variant(&editor, &variant, generic_params); @@ -343,45 +349,35 @@ fn update_variant( let field_list = make.tuple_field_list(iter::once(tuple_field)); editor.replace(variant.field_list()?.syntax(), field_list.syntax()); - // remove any ws after the name - if let Some(ws) = name - .syntax() - .siblings_with_tokens(syntax::Direction::Next) - .find_map(|tok| tok.into_token().filter(|tok| tok.kind() == WHITESPACE)) - { - editor.delete(ws); + if let Some(token) = name.syntax().last_non_trivia_token() { + editor.strip_trailing_blank_trivia(&token); } Some(()) } -fn collect_variant_comments( - make: &SyntaxFactory, - node: &SyntaxNode, -) -> (Vec, Vec) { - let mut to_insert: Vec = Vec::new(); - let mut to_delete: Vec = Vec::new(); - let mut after_comment = false; - - for child in node.children_with_tokens() { - match child.kind() { - COMMENT | DOC_COMMENT => { - after_comment = true; - to_insert.push(child.clone()); - to_delete.push(child); - } - WHITESPACE if after_comment => { - after_comment = false; - to_insert.push(make.whitespace("\n").into()); - to_delete.push(child); - } - _ => { - after_comment = false; - } - } - } - - (to_insert, to_delete) +fn take_variant_comments( + editor: &SyntaxEditor, + variant: &ast::Variant, + indent: IndentLevel, +) -> String { + let Some(token) = variant.syntax().first_non_trivia_token() else { return String::new() }; + let trivia: Vec<_> = token.leading_trivia().collect(); + let Some(last) = trivia.iter().rposition(|it| it.kind() == COMMENT) else { + return String::new(); + }; + let end = trivia[last..] + .iter() + .position(|it| it.kind() == NEWLINE) + .map_or(trivia.len() - 1, |offset| last + offset); + + let comments = trivia[..=end] + .iter() + .filter(|it| it.kind() == COMMENT) + .map(|it| format!("{indent}{}\n", it.text())) + .collect(); + editor.splice_leading_trivia(&token, ..=end, []); + comments } fn apply_references( @@ -403,8 +399,8 @@ fn apply_references( } // deep clone to prevent cycle let path = make.path_from_segments(iter::once(segment.clone()), false); - editor.insert(Position::before(segment.syntax()), make.token(T!['('])); editor.insert(Position::before(segment.syntax()), path.syntax()); + editor.insert(Position::before(segment.syntax()), make.token(T!['('])); editor.insert(Position::after(&node), make.token(T![')'])); } @@ -450,7 +446,7 @@ fn reference_to_node( reference.name.as_name_ref()?.syntax().parent().and_then(ast::PathSegment::cast)?; // filter out the reference in marco - let segment_range = segment.syntax().text_range(); + let segment_range = segment.syntax().text_range_without_outer_trivia(); if segment_range != reference.range { return None; } diff --git a/crates/ide-assists/src/handlers/extract_type_alias.rs b/crates/ide-assists/src/handlers/extract_type_alias.rs index a378256b598a..3b5a4336234e 100644 --- a/crates/ide-assists/src/handlers/extract_type_alias.rs +++ b/crates/ide-assists/src/handlers/extract_type_alias.rs @@ -1,12 +1,9 @@ use either::Either; use hir::HirDisplay; use ide_db::syntax_helpers::{node_ext::walk_ty, suggest_name::NameGenerator}; -use syntax::{ - ast::{self, AstNode, HasGenericArgs, HasGenericParams, HasName, edit::IndentLevel}, - syntax_editor, -}; +use syntax::ast::{self, AstNode, HasGenericArgs, HasGenericParams, HasName, edit::IndentLevel}; -use crate::{AssistContext, AssistId, Assists}; +use crate::{AssistContext, AssistId, Assists, utils::insert_before_with_separator}; // Assist: extract_type_alias // @@ -38,7 +35,7 @@ pub(crate) fn extract_type_alias(acc: &mut Assists, ctx: &AssistContext<'_, '_>) || item.syntax(), |impl_| impl_.as_ref().either(AstNode::syntax, AstNode::syntax), ); - let target = ty.syntax().text_range(); + let target = ty.syntax().text_range_without_outer_trivia(); let scope = ctx.sema.scope(ty.syntax())?; let resolved_ty = ctx.sema.resolve_type(&ty)?; @@ -94,12 +91,11 @@ pub(crate) fn extract_type_alias(acc: &mut Assists, ctx: &AssistContext<'_, '_>) } let indent = IndentLevel::from_node(node); - editor.insert_all( - syntax_editor::Position::before(node), - vec![ - ty_alias.syntax().clone().into(), - make.whitespace(&format!("\n\n{indent}")).into(), - ], + insert_before_with_separator( + &editor, + node, + ty_alias.syntax(), + &format!("\n\n{indent}"), ); builder.add_file_edits(ctx.vfs_file_id(), editor); diff --git a/crates/ide-assists/src/handlers/extract_variable.rs b/crates/ide-assists/src/handlers/extract_variable.rs index e2ff8fa2fc6d..24c65fc513f5 100644 --- a/crates/ide-assists/src/handlers/extract_variable.rs +++ b/crates/ide-assists/src/handlers/extract_variable.rs @@ -6,8 +6,8 @@ use ide_db::{ syntax_helpers::{LexedStr, suggest_name}, }; use syntax::{ - Direction, NodeOrToken, SyntaxElement, SyntaxKind, SyntaxNode, SyntaxToken, T, TextRange, - algo::{ancestors_at_offset, skip_trivia_token}, + NodeOrToken, SyntaxElement, SyntaxKind, SyntaxNode, SyntaxToken, T, TextRange, + algo::{self, ancestors_at_offset}, ast::{ self, AstNode, edit::{AstNodeEdit, IndentLevel}, @@ -171,7 +171,10 @@ pub(crate) fn extract_variable(acc: &mut Assists, ctx: &AssistContext<'_, '_>) - _ => false, }; let module = ctx.sema.scope(analysis.syntax())?.module(); - let target = to_replace.start().text_range().cover(to_replace.end().text_range()); + let target = to_replace + .start() + .text_range_without_outer_trivia() + .cover(to_replace.end().text_range_without_outer_trivia()); let needs_mut = match &parent { Some(ast::Expr::RefExpr(expr)) => expr.mut_token().is_some(), _ => needs_adjust && !needs_ref && ty.as_ref().is_some_and(|ty| ty.is_mutable_reference()), @@ -272,23 +275,19 @@ pub(crate) fn extract_variable(acc: &mut Assists, ctx: &AssistContext<'_, '_>) - match &anchor { Anchor::Before(place) => { - let prev_ws = place.prev_sibling_or_token().and_then(|it| it.into_token()); let indent_to = IndentLevel::from_node(place); - // Adjust ws to insert depending on if this is all inline or on separate lines - let trailing_ws = if prev_ws.is_some_and(|it| it.text().starts_with('\n')) { - format!("\n{indent_to}") + let stmt = if algo::starts_line(&place.clone().into()) { + let stmt = make.with_leading_trivia( + new_stmt.syntax().clone(), + &indent_to.to_string(), + ); + make.with_trailing_trivia(&stmt, "\n") } else { - " ".to_owned() + make.with_trailing_trivia(new_stmt.syntax().clone(), " ") }; - editor.insert_all( - Position::before(place), - vec![ - new_stmt.syntax().clone().into(), - make.whitespace(&trailing_ws).into(), - ], - ); + editor.insert(Position::before(place), stmt); editor.replace_all(to_replace, vec![name_expr.syntax().syntax_element()]); } @@ -332,8 +331,8 @@ fn extract_token_range_of( let first = node.token_at_offset(range.start()).right_biased()?; let last = node.token_at_offset(range.end()).left_biased()?; - let first = skip_trivia_token(first, Direction::Next)?; - let last = skip_trivia_token(last, Direction::Next)?; + let first = if !first.is_trivia() { first } else { first.next_non_trivia_token()? }; + let last = if !last.is_trivia() { last } else { last.next_non_trivia_token()? }; if first.text_range().ordering(last.text_range()).is_gt() { return None; diff --git a/crates/ide-assists/src/handlers/fix_visibility.rs b/crates/ide-assists/src/handlers/fix_visibility.rs index 54784fa9903c..05aa26be676b 100644 --- a/crates/ide-assists/src/handlers/fix_visibility.rs +++ b/crates/ide-assists/src/handlers/fix_visibility.rs @@ -87,19 +87,13 @@ fn add_vis_to_referenced_module_def(acc: &mut Assists, ctx: &AssistContext<'_, ' .syntax() .children_with_tokens() .find(|it| { - !matches!( - it.kind(), - syntax::SyntaxKind::WHITESPACE - | syntax::SyntaxKind::COMMENT - | syntax::SyntaxKind::DOC_COMMENT - | syntax::SyntaxKind::ATTR - ) + !matches!(it.kind(), syntax::SyntaxKind::DOC_COMMENT | syntax::SyntaxKind::ATTR) }) .unwrap_or_else(|| vis_owner.syntax().first_child_or_token().unwrap()); - editor.insert_all( - syntax::syntax_editor::Position::before(vis_before), - vec![missing_visibility.syntax().clone().into(), make.whitespace(" ").into()], + editor.insert_taking_leading( + vis_before, + editor.make().with_trailing_trivia(missing_visibility.syntax().clone(), " "), ); } @@ -168,7 +162,7 @@ fn target_data_for_def( target_name = m.name(db); let in_file_source = m.declaration_source(db)?; let file_id = in_file_source.file_id.original_file(db); - let range = in_file_source.value.syntax().text_range(); + let range = in_file_source.value.syntax().text_range_without_outer_trivia(); (ast::AnyHasVisibility::new(in_file_source.value), range, file_id.file_id(db)) } // FIXME diff --git a/crates/ide-assists/src/handlers/flip_binexpr.rs b/crates/ide-assists/src/handlers/flip_binexpr.rs index d47f5c83cd7e..d3bf86988fb2 100644 --- a/crates/ide-assists/src/handlers/flip_binexpr.rs +++ b/crates/ide-assists/src/handlers/flip_binexpr.rs @@ -1,6 +1,6 @@ use syntax::{ SyntaxKind, T, - ast::{self, AstNode, BinExpr, RangeItem}, + ast::{self, AstNode, BinExpr, RangeItem, edit::AstNodeEdit}, syntax_editor::Position, }; @@ -53,8 +53,9 @@ pub(crate) fn flip_binexpr(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Op if let FlipAction::FlipAndReplaceOp(binary_op) = action { editor.replace(op_token, make.token(binary_op)) }; - editor.replace(lhs.syntax(), rhs.syntax()); - editor.replace(rhs.syntax(), lhs.syntax()); + let (left, right) = (lhs.detached(), rhs.detached()); + editor.replace(lhs.syntax(), right.syntax()); + editor.replace(rhs.syntax(), left.syntax()); builder.add_file_edits(ctx.vfs_file_id(), editor); }, ) @@ -136,8 +137,9 @@ pub(crate) fn flip_range_expr(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> match (start, end) { (Some(start), Some(end)) => { - editor.replace(start.syntax(), end.syntax()); - editor.replace(end.syntax(), start.syntax()); + let (first, second) = (start.detached(), end.detached()); + editor.replace(start.syntax(), second.syntax()); + editor.replace(end.syntax(), first.syntax()); } (Some(start), None) => { editor.delete(start.syntax()); diff --git a/crates/ide-assists/src/handlers/flip_comma.rs b/crates/ide-assists/src/handlers/flip_comma.rs index 00d659adc130..aeb2e29bbf79 100644 --- a/crates/ide-assists/src/handlers/flip_comma.rs +++ b/crates/ide-assists/src/handlers/flip_comma.rs @@ -1,6 +1,5 @@ use syntax::{ - AstNode, Direction, NodeOrToken, SyntaxKind, SyntaxToken, T, - algo::non_trivia_sibling, + AstNode, NodeOrToken, SyntaxKind, SyntaxToken, T, ast::{self, syntax_factory::SyntaxFactory}, }; @@ -23,8 +22,8 @@ use crate::{AssistContext, AssistId, Assists}; // ``` pub(crate) fn flip_comma(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Option<()> { let comma = ctx.find_token_syntax_at_offset(T![,])?; - let prev = non_trivia_sibling(comma.clone().into(), Direction::Prev)?; - let next = non_trivia_sibling(comma.clone().into(), Direction::Next)?; + let prev = comma.prev_sibling_or_token()?; + let next = comma.next_sibling_or_token()?; // Don't apply a "flip" in case of a last comma // that typically comes before punctuation @@ -49,8 +48,8 @@ pub(crate) fn flip_comma(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Opti let new_tree = flip_tree(parent.clone(), comma, editor.make()); editor.replace(parent.syntax(), new_tree.syntax()); } else { - editor.replace(prev.clone(), next.clone()); - editor.replace(next.clone(), prev.clone()); + editor.replace_verbatim(prev.clone(), next.clone()); + editor.replace_verbatim(next.clone(), prev.clone()); } builder.add_file_edits(ctx.vfs_file_id(), editor); diff --git a/crates/ide-assists/src/handlers/flip_or_pattern.rs b/crates/ide-assists/src/handlers/flip_or_pattern.rs index c60c6a2a9808..8673673cef82 100644 --- a/crates/ide-assists/src/handlers/flip_or_pattern.rs +++ b/crates/ide-assists/src/handlers/flip_or_pattern.rs @@ -1,7 +1,6 @@ use syntax::{ - Direction, T, - algo::non_trivia_sibling, - ast::{self, AstNode}, + T, + ast::{self, AstNode, edit::AstNodeEdit}, }; use crate::{AssistContext, AssistId, Assists}; @@ -27,14 +26,15 @@ pub(crate) fn flip_or_pattern(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> let parent = ast::OrPat::cast(pipe.parent()?)?; - let before = non_trivia_sibling(pipe.clone().into(), Direction::Prev)?.into_node()?; - let after = non_trivia_sibling(pipe.clone().into(), Direction::Next)?.into_node()?; + let before = ast::Pat::cast(pipe.prev_sibling_or_token()?.into_node()?)?; + let after = ast::Pat::cast(pipe.next_sibling_or_token()?.into_node()?)?; let target = pipe.text_range(); acc.add(AssistId::refactor_rewrite("flip_or_pattern"), "Flip patterns", target, |builder| { let editor = builder.make_editor(parent.syntax()); - editor.replace(before.clone(), after.clone()); - editor.replace(after, before); + let (first, second) = (before.detached(), after.detached()); + editor.replace(before.syntax(), second.syntax()); + editor.replace(after.syntax(), first.syntax()); builder.add_file_edits(ctx.vfs_file_id(), editor); }) } diff --git a/crates/ide-assists/src/handlers/flip_trait_bound.rs b/crates/ide-assists/src/handlers/flip_trait_bound.rs index 77d5c042c926..b3ecfaefc82f 100644 --- a/crates/ide-assists/src/handlers/flip_trait_bound.rs +++ b/crates/ide-assists/src/handlers/flip_trait_bound.rs @@ -1,7 +1,6 @@ use syntax::{ - Direction, T, - algo::non_trivia_sibling, - ast::{self, AstNode}, + T, + ast::{self, AstNode, edit::AstNodeEdit}, }; use crate::{AssistContext, AssistId, Assists}; @@ -24,8 +23,8 @@ pub(crate) fn flip_trait_bound(acc: &mut Assists, ctx: &AssistContext<'_, '_>) - // Make sure we're in a `TypeBoundList` let parent = ast::TypeBoundList::cast(plus.parent()?)?; - let before = non_trivia_sibling(plus.clone().into(), Direction::Prev)?.into_node()?; - let after = non_trivia_sibling(plus.clone().into(), Direction::Next)?.into_node()?; + let before = ast::TypeBound::cast(plus.prev_sibling_or_token()?.into_node()?)?; + let after = ast::TypeBound::cast(plus.next_sibling_or_token()?.into_node()?)?; let target = plus.text_range(); acc.add( @@ -34,8 +33,9 @@ pub(crate) fn flip_trait_bound(acc: &mut Assists, ctx: &AssistContext<'_, '_>) - target, |builder| { let editor = builder.make_editor(parent.syntax()); - editor.replace(before.clone(), after.clone()); - editor.replace(after, before); + let (first, second) = (before.detached(), after.detached()); + editor.replace(before.syntax(), second.syntax()); + editor.replace(after.syntax(), first.syntax()); builder.add_file_edits(ctx.vfs_file_id(), editor); }, ) diff --git a/crates/ide-assists/src/handlers/generate_blanket_trait_impl.rs b/crates/ide-assists/src/handlers/generate_blanket_trait_impl.rs index 738f461a1f2f..7fa5374c2695 100644 --- a/crates/ide-assists/src/handlers/generate_blanket_trait_impl.rs +++ b/crates/ide-assists/src/handlers/generate_blanket_trait_impl.rs @@ -71,7 +71,7 @@ pub(crate) fn generate_blanket_trait_impl( acc.add( AssistId("generate_blanket_trait_impl", AssistKind::Generate, None), "Generate blanket trait implementation", - name.syntax().text_range(), + name.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(traitd.syntax()); let make = editor.make(); @@ -130,12 +130,9 @@ pub(crate) fn generate_blanket_trait_impl( let impl_ = impl_.indent(indent); - editor.insert_all( + editor.insert( Position::after(traitd.syntax()), - vec![ - make.whitespace(&format!("\n\n{indent}")).into(), - impl_.syntax().clone().into(), - ], + make.with_leading_trivia(impl_.syntax().clone(), &format!("\n\n{indent}")), ); if let Some(cap) = ctx.config.snippet_cap diff --git a/crates/ide-assists/src/handlers/generate_constant.rs b/crates/ide-assists/src/handlers/generate_constant.rs index 6c5042b14f9e..58f5236425e9 100644 --- a/crates/ide-assists/src/handlers/generate_constant.rs +++ b/crates/ide-assists/src/handlers/generate_constant.rs @@ -6,7 +6,7 @@ use ide_db::{ defs::{Definition, NameRefClass}, }; use syntax::{ - AstNode, Direction, SyntaxKind, TextSize, + AstNode, SyntaxKind, TextSize, ast::{self, NameRef, edit::IndentLevel}, }; @@ -33,7 +33,7 @@ use syntax::{ pub(crate) fn generate_constant(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Option<()> { let constant_token = ctx.find_node_at_offset::()?; - if constant_token.to_string().chars().any(|it| !(it.is_uppercase() || it == '_')) { + if constant_token.text().chars().any(|it| !(it.is_uppercase() || it == '_')) { cov_mark::hit!(not_constant_name); return None; } @@ -82,7 +82,12 @@ pub(crate) fn generate_constant(acc: &mut Assists, ctx: &AssistContext<'_, '_>) target_data_for_generate_constant(ctx, current_module, constant_module).unwrap_or_else( || { let indent = IndentLevel::from_node(statement.syntax()); - (statement.syntax().text_range().start(), indent, None, format!("\n{indent}")) + ( + statement.syntax().text_range_without_outer_trivia().start(), + indent, + None, + format!("\n{indent}"), + ) }, ); @@ -129,9 +134,8 @@ fn target_data_for_generate_constant( let l_curly_token = module_node.item_list()?.l_curly_token()?; let offset = l_curly_token.text_range().end(); - let siblings_has_newline = l_curly_token - .siblings_with_tokens(Direction::Next) - .any(|it| it.kind() == SyntaxKind::WHITESPACE && it.to_string().contains('\n')); + let siblings_has_newline = + l_curly_token.trailing_trivia().any(|it| it.kind() == SyntaxKind::NEWLINE); let post_string = if siblings_has_newline { format!("{indent}") } else { format!("\n{indent}") }; Some((offset, indent + 1, Some(file_id.file_id(ctx.db())), post_string)) diff --git a/crates/ide-assists/src/handlers/generate_default_from_enum_variant.rs b/crates/ide-assists/src/handlers/generate_default_from_enum_variant.rs index 07c191b0eb66..3cdc37b21697 100644 --- a/crates/ide-assists/src/handlers/generate_default_from_enum_variant.rs +++ b/crates/ide-assists/src/handlers/generate_default_from_enum_variant.rs @@ -42,7 +42,7 @@ pub(crate) fn generate_default_from_enum_variant( cov_mark::hit!(test_gen_default_on_non_unit_variant_not_implemented); return None; } - if !variant.syntax().text_range().contains_range(ctx.selection_trimmed()) { + if !variant.syntax().text_range_without_outer_trivia().contains_range(ctx.selection_trimmed()) { return None; } @@ -51,7 +51,7 @@ pub(crate) fn generate_default_from_enum_variant( return None; } - let target = variant.syntax().text_range(); + let target = variant.syntax().text_range_without_outer_trivia(); acc.add( AssistId::generate("generate_default_from_enum_variant"), "Generate `Default` impl from this enum variant", @@ -62,12 +62,12 @@ pub(crate) fn generate_default_from_enum_variant( let indent = adt.indent_level(); let impl_ = default_impl(variant_name, &adt, make); - editor.insert_all( + editor.insert( Position::after(adt.syntax()), - vec![ - make.whitespace(&format!("\n\n{indent}")).into(), - impl_.indent(indent).syntax().clone().into(), - ], + make.with_leading_trivia( + impl_.indent(indent).syntax().clone(), + &format!("\n\n{indent}"), + ), ); edit.add_file_edits(ctx.vfs_file_id(), editor); }, diff --git a/crates/ide-assists/src/handlers/generate_default_from_new.rs b/crates/ide-assists/src/handlers/generate_default_from_new.rs index 34ab3c430412..20758e508d80 100644 --- a/crates/ide-assists/src/handlers/generate_default_from_new.rs +++ b/crates/ide-assists/src/handlers/generate_default_from_new.rs @@ -69,7 +69,7 @@ pub(crate) fn generate_default_from_new( return None; } - let target = impl_.syntax().text_range(); + let target = impl_.syntax().text_range_without_outer_trivia(); acc.add( AssistId::generate("generate_default_from_new"), @@ -82,12 +82,9 @@ pub(crate) fn generate_default_from_new( let indent = IndentLevel::from_node(impl_.syntax()); let default_impl = default_impl.indent(indent); - editor.insert_all( + editor.insert( Position::after(impl_.syntax()), - vec![ - make.whitespace(&format!("\n\n{indent}")).into(), - default_impl.syntax().clone().into(), - ], + make.with_leading_trivia(default_impl.syntax().clone(), &format!("\n\n{indent}")), ); builder.add_file_edits(ctx.vfs_file_id(), editor); }, diff --git a/crates/ide-assists/src/handlers/generate_delegate_methods.rs b/crates/ide-assists/src/handlers/generate_delegate_methods.rs index 6c9808fb1c3b..ba1022198ea7 100644 --- a/crates/ide-assists/src/handlers/generate_delegate_methods.rs +++ b/crates/ide-assists/src/handlers/generate_delegate_methods.rs @@ -65,14 +65,18 @@ pub(crate) fn generate_delegate_methods( Some(field) => { let field_name = field.name()?; let field_ty = field.ty()?; - (field_name.to_string(), field_ty, field.syntax().text_range()) + (field_name.to_string(), field_ty, field.syntax().text_range_without_outer_trivia()) } None => { let field = ctx.find_node_at_offset::()?; let field_list = ctx.find_node_at_offset::()?; let field_list_index = field_list.fields().position(|it| it == field)?; let field_ty = field.ty()?; - (field_list_index.to_string(), field_ty, field.syntax().text_range()) + ( + field_list_index.to_string(), + field_ty, + field.syntax().text_range_without_outer_trivia(), + ) } }; @@ -213,12 +217,12 @@ pub(crate) fn generate_delegate_methods( let impl_def = impl_def.indent(indent); // Insert the impl block. - editor.insert_all( + editor.insert( Position::after(strukt.syntax()), - vec![ - make.whitespace(&format!("\n\n{indent}")).into(), - impl_def.syntax().clone().into(), - ], + make.with_leading_trivia( + impl_def.syntax().clone(), + &format!("\n\n{indent}"), + ), ); impl_def.assoc_item_list().and_then(|list| list.assoc_items().next()) } diff --git a/crates/ide-assists/src/handlers/generate_delegate_trait.rs b/crates/ide-assists/src/handlers/generate_delegate_trait.rs index e21f1ab35984..65c48154c642 100644 --- a/crates/ide-assists/src/handlers/generate_delegate_trait.rs +++ b/crates/ide-assists/src/handlers/generate_delegate_trait.rs @@ -132,11 +132,11 @@ impl Field { let (name, range, ty) = match f { Either::Left(f) => { let name = f.name()?.to_string(); - (name, f.syntax().text_range(), f.ty()?) + (name, f.syntax().text_range_without_outer_trivia(), f.ty()?) } Either::Right((f, l)) => { let name = l.fields().position(|it| it == f)?.to_string(); - (name, f.syntax().text_range(), f.ty()?) + (name, f.syntax().text_range_without_outer_trivia(), f.ty()?) } }; @@ -242,7 +242,7 @@ impl Struct { field.range, |builder| { builder.insert( - self.strukt.syntax().text_range().end(), + self.strukt.syntax().text_range_without_outer_trivia().end(), format!("\n\n{}", delegate.syntax()), ); }, @@ -519,7 +519,7 @@ fn remove_useless_where_clauses(editor: &SyntaxEditor, delegate: &ast::Impl) { pred.syntax() .descendants_with_tokens() .filter_map(|e| e.into_token()) - .any(|e| e.kind() == SyntaxKind::IDENT && live_generics.contains(&e.to_string())) + .any(|e| e.kind() == SyntaxKind::IDENT && live_generics.contains(e.text())) .not() }; diff --git a/crates/ide-assists/src/handlers/generate_deref.rs b/crates/ide-assists/src/handlers/generate_deref.rs index 9d1b257af40c..d253691ac825 100644 --- a/crates/ide-assists/src/handlers/generate_deref.rs +++ b/crates/ide-assists/src/handlers/generate_deref.rs @@ -62,7 +62,7 @@ fn generate_record_deref(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Opti let field_type = field.ty()?; let field_name = field.name()?; - let target = field.syntax().text_range(); + let target = field.syntax().text_range_without_outer_trivia(); let file_id = ctx.vfs_file_id(); acc.add( AssistId::generate("generate_deref"), @@ -105,7 +105,7 @@ fn generate_tuple_deref(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Optio let trait_path = module.find_path(ctx.db(), ModuleDef::Trait(trait_), cfg)?; let field_type = field.ty()?; - let target = field.syntax().text_range(); + let target = field.syntax().text_range_without_outer_trivia(); let file_id = ctx.vfs_file_id(); acc.add( AssistId::generate("generate_deref"), @@ -198,9 +198,9 @@ fn generate_edit( let indent = strukt.indent_level(); let impl_ = generate_trait_impl_intransitive_with_item(make, &strukt_adt, trait_ty, body) .indent(indent); - editor.insert_all( + editor.insert( Position::after(strukt.syntax()), - vec![make.whitespace(&format!("\n\n{indent}")).into(), impl_.syntax().clone().into()], + make.with_leading_trivia(impl_.syntax().clone(), &format!("\n\n{indent}")), ); edit.add_file_edits(file_id, editor); } diff --git a/crates/ide-assists/src/handlers/generate_derive.rs b/crates/ide-assists/src/handlers/generate_derive.rs index b24ba4b9abcf..001c94fe22fa 100644 --- a/crates/ide-assists/src/handlers/generate_derive.rs +++ b/crates/ide-assists/src/handlers/generate_derive.rs @@ -1,8 +1,8 @@ use syntax::{ - SyntaxKind::{ATTR, COMMENT, DOC_COMMENT, WHITESPACE}, + SyntaxKind::{ATTR, DOC_COMMENT}, T, ast::{self, AstNode, HasAttrs, edit::IndentLevel}, - syntax_editor::{Element, Position}, + syntax_editor::Position, }; use crate::{AssistContext, AssistId, Assists}; @@ -28,7 +28,7 @@ use crate::{AssistContext, AssistId, Assists}; pub(crate) fn generate_derive(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Option<()> { let cap = ctx.config.snippet_cap?; let nominal = ctx.find_node_at_offset::()?; - let target = nominal.syntax().text_range(); + let target = nominal.syntax().text_range_without_outer_trivia(); let derive_attr = nominal .attrs() .filter_map(|x| x.as_simple_call()) @@ -52,19 +52,20 @@ pub(crate) fn generate_derive(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> make.token_tree(T!['('], vec![]), )); let indent = IndentLevel::from_node(nominal.syntax()); - let after_attrs_and_comments = nominal + let anchor = nominal .syntax() .children_with_tokens() - .find(|it| !matches!(it.kind(), WHITESPACE | COMMENT | DOC_COMMENT | ATTR)) - .map_or(Position::first_child_of(nominal.syntax()), Position::before); - - editor.insert_all( - after_attrs_and_comments, - vec![ - derive.syntax().syntax_element(), - make.whitespace(&format!("\n{indent}")).syntax_element(), - ], - ); + .find(|it| !matches!(it.kind(), DOC_COMMENT | ATTR)); + let payload = make.with_trailing_trivia(derive.syntax(), "\n"); + match anchor { + Some(anchor) => { + editor.insert_taking_leading(anchor.clone(), payload); + editor.prepend_leading_trivia(anchor, &indent.to_string()); + } + None => { + editor.insert(Position::first_child_of(nominal.syntax()), payload); + } + } let meta = derive.meta().expect("make::attr_outer was expected to have Meta"); let ast::Meta::TokenTreeMeta(meta) = meta else { diff --git a/crates/ide-assists/src/handlers/generate_documentation_template.rs b/crates/ide-assists/src/handlers/generate_documentation_template.rs index 72971e55222c..d8c25a961842 100644 --- a/crates/ide-assists/src/handlers/generate_documentation_template.rs +++ b/crates/ide-assists/src/handlers/generate_documentation_template.rs @@ -52,7 +52,7 @@ pub(crate) fn generate_documentation_template( } let parent_syntax = ast_func.syntax(); - let text_range = parent_syntax.text_range(); + let text_range = parent_syntax.text_range_without_outer_trivia(); let indent_level = IndentLevel::from_node(parent_syntax); acc.add( @@ -100,7 +100,7 @@ pub(crate) fn generate_doc_example(acc: &mut Assists, ctx: &AssistContext<'_, '_ let node = doc_at_cursor.syntax().parent()?; let last_doc_comment = ast::AnyHasAttrs::cast(node.clone())?.doc_comments().last()?; let next_token = skip_whitespace_token( - last_doc_comment.syntax().last_token()?.next_token()?, + last_doc_comment.syntax().last_non_trivia_token()?.next_token()?, syntax::Direction::Next, )?; diff --git a/crates/ide-assists/src/handlers/generate_enum_is_method.rs b/crates/ide-assists/src/handlers/generate_enum_is_method.rs index 5e2ee772b9a5..082d9530ac5b 100644 --- a/crates/ide-assists/src/handlers/generate_enum_is_method.rs +++ b/crates/ide-assists/src/handlers/generate_enum_is_method.rs @@ -61,7 +61,7 @@ pub(crate) fn generate_enum_is_method( // Return early if we've found an existing new fn let impl_def = find_struct_impl(ctx, &parent_enum, &fn_names)?; - let target = variant.syntax().text_range(); + let target = variant.syntax().text_range_without_outer_trivia(); acc.add_group( &GroupLabel("Generate an `is_`,`as_`, or `try_into_` for this enum variant".to_owned()), AssistId::generate("generate_enum_is_method"), @@ -87,12 +87,9 @@ pub(crate) fn generate_enum_is_method( let indent = parent_enum.indent_level(); let assoc_list = make.assoc_item_list(fn_items); let new_impl = generate_impl_with_item(make, &parent_enum, Some(assoc_list)); - editor.insert_all( + editor.insert( Position::after(parent_enum.syntax()), - vec![ - make.whitespace(&format!("\n\n{indent}")).into(), - new_impl.syntax().clone().into(), - ], + make.with_leading_trivia(new_impl.syntax().clone(), &format!("\n\n{indent}")), ); builder.add_file_edits(ctx.vfs_file_id(), editor); }, diff --git a/crates/ide-assists/src/handlers/generate_enum_projection_method.rs b/crates/ide-assists/src/handlers/generate_enum_projection_method.rs index 479143c13335..b10511d6d9fa 100644 --- a/crates/ide-assists/src/handlers/generate_enum_projection_method.rs +++ b/crates/ide-assists/src/handlers/generate_enum_projection_method.rs @@ -139,7 +139,7 @@ fn generate_enum_projection_method( // Return early if we've found an existing new fn let impl_def = find_struct_impl(ctx, &parent_enum, &fn_names)?; - let target = variant.syntax().text_range(); + let target = variant.syntax().text_range_without_outer_trivia(); acc.add_group( &GroupLabel("Generate an `is_`,`as_`, or `try_into_` for this enum variant".to_owned()), AssistId::generate(assist_id), @@ -166,12 +166,9 @@ fn generate_enum_projection_method( let indent = parent_enum.indent_level(); let assoc_list = make.assoc_item_list(fn_items); let new_impl = generate_impl_with_item(make, &parent_enum, Some(assoc_list)); - editor.insert_all( + editor.insert( Position::after(parent_enum.syntax()), - vec![ - make.whitespace(&format!("\n\n{indent}")).into(), - new_impl.syntax().clone().into(), - ], + make.with_leading_trivia(new_impl.syntax().clone(), &format!("\n\n{indent}")), ); builder.add_file_edits(ctx.vfs_file_id(), editor); }, diff --git a/crates/ide-assists/src/handlers/generate_enum_variant.rs b/crates/ide-assists/src/handlers/generate_enum_variant.rs index 73837f486cb3..d060dab75d1f 100644 --- a/crates/ide-assists/src/handlers/generate_enum_variant.rs +++ b/crates/ide-assists/src/handlers/generate_enum_variant.rs @@ -53,7 +53,7 @@ pub(crate) fn generate_enum_variant(acc: &mut Assists, ctx: &AssistContext<'_, ' return None; }; - let target = path.syntax().text_range(); + let target = path.syntax().text_range_without_outer_trivia(); let name_ref: &ast::NameRef = &name_ref; let db = ctx.db(); let InRealFile { file_id, value: enum_node } = e.source(db)?.original_ast_node_rooted(db)?; diff --git a/crates/ide-assists/src/handlers/generate_fn_type_alias.rs b/crates/ide-assists/src/handlers/generate_fn_type_alias.rs index a9f5ab6976a1..8722bad77409 100644 --- a/crates/ide-assists/src/handlers/generate_fn_type_alias.rs +++ b/crates/ide-assists/src/handlers/generate_fn_type_alias.rs @@ -3,10 +3,9 @@ use ide_db::assists::{AssistId, GroupLabel}; use syntax::{ AstNode, ast::{self, HasGenericParams, HasName, edit::IndentLevel}, - syntax_editor, }; -use crate::{AssistContext, Assists}; +use crate::{AssistContext, Assists, utils::insert_before_with_separator}; // Assist: generate_fn_type_alias_named // @@ -53,7 +52,7 @@ pub(crate) fn generate_fn_type_alias(acc: &mut Assists, ctx: &AssistContext<'_, &GroupLabel("Generate a type alias for function...".into()), style.assist_id(), style.label(), - func_node.syntax().text_range(), + func_node.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(func); let make = editor.make(); @@ -103,12 +102,11 @@ pub(crate) fn generate_fn_type_alias(acc: &mut Assists, ctx: &AssistContext<'_, ); let indent = IndentLevel::from_node(insertion_node); - editor.insert_all( - syntax_editor::Position::before(insertion_node), - vec![ - ty_alias.syntax().clone().into(), - make.whitespace(&format!("\n\n{indent}")).into(), - ], + insert_before_with_separator( + &editor, + insertion_node, + ty_alias.syntax(), + &format!("\n\n{indent}"), ); if let Some(cap) = ctx.config.snippet_cap diff --git a/crates/ide-assists/src/handlers/generate_from_impl_for_enum.rs b/crates/ide-assists/src/handlers/generate_from_impl_for_enum.rs index 1617016172d0..b6b50f9cf3b8 100644 --- a/crates/ide-assists/src/handlers/generate_from_impl_for_enum.rs +++ b/crates/ide-assists/src/handlers/generate_from_impl_for_enum.rs @@ -32,7 +32,7 @@ pub(crate) fn generate_from_impl_for_enum( let adt = ast::Adt::Enum(variant.parent_enum()); let variants = selected_variants(ctx, &variant)?; - let target = variant.syntax().text_range(); + let target = variant.syntax().text_range_without_outer_trivia(); let file_id = ctx.vfs_file_id(); acc.add( AssistId::generate("generate_from_impl_for_enum"), @@ -46,8 +46,7 @@ pub(crate) fn generate_from_impl_for_enum( for variant_info in variants { let impl_ = build_from_impl(make, &adt, variant_info).indent(indent); - elements.push(make.whitespace(&format!("\n\n{indent}")).into()); - elements.push(impl_.syntax().clone().into()); + elements.push(make.with_leading_trivia(impl_.syntax(), &format!("\n\n{indent}"))); } editor.insert_all(Position::after(adt.syntax()), elements); diff --git a/crates/ide-assists/src/handlers/generate_function.rs b/crates/ide-assists/src/handlers/generate_function.rs index 13096c6efc37..51e0667db7f9 100644 --- a/crates/ide-assists/src/handlers/generate_function.rs +++ b/crates/ide-assists/src/handlers/generate_function.rs @@ -13,7 +13,7 @@ use ide_db::{ use itertools::Itertools; use stdx::to_lower_snake_case; use syntax::{ - Edition, SyntaxKind, SyntaxNode, T, TextRange, + Edition, SyntaxKind, SyntaxNode, SyntaxToken, T, TextRange, ast::{ self, AstNode, BlockExpr, CallExpr, HasArgList, HasGenericParams, HasModuleItem, HasTypeBounds, @@ -80,7 +80,7 @@ fn gen_fn(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Option<()> { let function_builder = FunctionBuilder::from_call(&make, ctx, &call, fn_name, target_module, target, &adt_info)?; - let text_range = call.syntax().text_range(); + let text_range = call.syntax().text_range_without_outer_trivia(); let label = format!("Generate {} function", function_builder.fn_name); add_func_to_accumulator(acc, ctx, text_range, function_builder, file, adt_info, label) } @@ -174,7 +174,7 @@ fn gen_method(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Option<()> { target_module, target, )?; - let text_range = call.syntax().text_range(); + let text_range = call.syntax().text_range_without_outer_trivia(); let adt_info = AdtInfo::new(adt, impl_.is_some()); let label = format!("Generate {} method", function_builder.fn_name); add_func_to_accumulator(acc, ctx, text_range, function_builder, file, Some(adt_info), label) @@ -653,8 +653,11 @@ impl GeneratedFunctionTarget { None => Position::first_child_of(item_list), }; - let indent = IndentLevel::from_node(item_list); - let leading_indent = indent + 1; + let leading_indent = IndentLevel::from_node(item_list) + 1; + let r_curly = item_list + .last_child_or_token() + .and_then(|it| it.into_token()) + .filter(|it| it.kind() == T!['}']); insert_rendered_fn( &editor, edit, @@ -662,7 +665,7 @@ impl GeneratedFunctionTarget { position, leading_indent, format!("\n{leading_indent}"), - Some(format!("\n{indent}")), + r_curly, cap, ); } @@ -685,13 +688,13 @@ impl GeneratedFunctionTarget { Some(child) => Position::after(child), None => Position::first_child_of(item_list.syntax()), }; - let indent = impl_.indent_level(); let leading_ws = if insert_after_item.is_some() { format!("\n\n{leading_indent}") } else { format!("\n{leading_indent}") }; - let trailing_ws = insert_after_item.is_none().then(|| format!("\n{indent}")); + let r_curly = + if insert_after_item.is_none() { item_list.r_curly_token() } else { None }; insert_rendered_fn( &editor, edit, @@ -699,7 +702,7 @@ impl GeneratedFunctionTarget { position, leading_indent, leading_ws, - trailing_ws, + r_curly, cap, ); } else { @@ -728,7 +731,6 @@ fn insert_rendered_impl( cap: Option, ) { let make = editor.make(); - let leading_ws = make.whitespace(&format!("\n{leading_ws_indent}")); let name = make.ty_path(make.ident_path(&format!( "{}", adt.name(ctx.db()).display(ctx.db(), function_builder.target_edition) @@ -743,7 +745,10 @@ fn insert_rendered_impl( add_generated_fn_annotation(editor, edit, function_builder, &fn_, cap); } - editor.insert_all(position, vec![leading_ws.into(), impl_.syntax().clone().into()]); + editor.insert( + position, + make.with_leading_trivia(impl_.syntax(), &format!("\n{leading_ws_indent}")), + ); } fn insert_rendered_fn( @@ -753,19 +758,19 @@ fn insert_rendered_fn( position: Position, indent: IndentLevel, leading_ws: String, - trailing_ws: Option, + r_curly: Option, cap: Option, ) { let make = editor.make(); - let leading_ws = make.whitespace(&leading_ws); let func = function_builder.render(make).indent(indent); add_generated_fn_annotation(editor, edit, function_builder, &func, cap); - let mut elements = vec![leading_ws.into(), func.syntax().clone().into()]; - if let Some(trailing_ws) = trailing_ws { - elements.push(make.whitespace(&trailing_ws).into()); + let mut func = make.with_leading_trivia(func.syntax(), &leading_ws); + if let Some(r_curly) = r_curly { + func = make.with_trailing_trivia(func, "\n"); + editor.prepend_leading_trivia(&r_curly, &IndentLevel::from_token(&r_curly).to_string()); } - editor.insert_all(position, elements); + editor.insert(position, func); } fn add_generated_fn_annotation( diff --git a/crates/ide-assists/src/handlers/generate_getter_or_setter.rs b/crates/ide-assists/src/handlers/generate_getter_or_setter.rs index b21e60876296..c4340db07ecb 100644 --- a/crates/ide-assists/src/handlers/generate_getter_or_setter.rs +++ b/crates/ide-assists/src/handlers/generate_getter_or_setter.rs @@ -405,7 +405,7 @@ fn parse_record_field( format_to!(fn_name, "_mut"); } - let target = record_field.syntax().text_range(); + let target = record_field.syntax().text_range_without_outer_trivia(); Some(RecordFieldInfo { field_name, field_ty, fn_name, target }) } @@ -467,9 +467,9 @@ fn build_source_change( None, Some(make.assoc_item_list(items)), ); - editor.insert_all( + editor.insert( Position::after(assist_info.strukt.syntax()), - vec![make.whitespace("\n\n").into(), impl_def.syntax().clone().into()], + make.with_leading_trivia(impl_def.syntax().clone(), "\n\n"), ); if let Some(cap) = ctx.config.snippet_cap diff --git a/crates/ide-assists/src/handlers/generate_impl.rs b/crates/ide-assists/src/handlers/generate_impl.rs index 9fa9a0461eaa..04cb5aa1bb06 100644 --- a/crates/ide-assists/src/handlers/generate_impl.rs +++ b/crates/ide-assists/src/handlers/generate_impl.rs @@ -16,13 +16,9 @@ fn insert_impl(editor: &SyntaxEditor, impl_: &ast::Impl, nominal: &impl AstNodeE let indent = nominal.indent_level(); let impl_ = impl_.indent(indent); - editor.insert_all( + editor.insert( Position::after(nominal.syntax()), - vec![ - // Add a blank line after the ADT, and indentation for the impl to match the ADT - make.whitespace(&format!("\n\n{indent}")).into(), - impl_.syntax().clone().into(), - ], + make.with_leading_trivia(impl_.syntax(), &format!("\n\n{indent}")), ); impl_ @@ -48,7 +44,7 @@ fn insert_impl(editor: &SyntaxEditor, impl_: &ast::Impl, nominal: &impl AstNodeE pub(crate) fn generate_impl(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Option<()> { let nominal = ctx.find_node_at_offset::()?; let name = nominal.name()?; - let target = nominal.syntax().text_range(); + let target = nominal.syntax().text_range_without_outer_trivia(); if ctx.find_node_at_offset::().is_some() { return None; @@ -96,7 +92,7 @@ pub(crate) fn generate_impl(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> O pub(crate) fn generate_trait_impl(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Option<()> { let nominal = ctx.find_node_at_offset::()?; let name = nominal.name()?; - let target = nominal.syntax().text_range(); + let target = nominal.syntax().text_range_without_outer_trivia(); if ctx.find_node_at_offset::().is_some() { return None; @@ -155,7 +151,7 @@ pub(crate) fn generate_impl_trait(acc: &mut Assists, ctx: &AssistContext<'_, '_> let target_scope = ctx.sema.scope(trait_.syntax())?; let hir_trait = ctx.sema.to_def(&trait_)?; - let target = trait_.syntax().text_range(); + let target = trait_.syntax().text_range_without_outer_trivia(); acc.add( AssistId::generate("generate_impl_trait"), format!("Generate `{name}` impl for type"), diff --git a/crates/ide-assists/src/handlers/generate_is_empty_from_len.rs b/crates/ide-assists/src/handlers/generate_is_empty_from_len.rs index 39f304cac9ca..133bb449b9c0 100644 --- a/crates/ide-assists/src/handlers/generate_is_empty_from_len.rs +++ b/crates/ide-assists/src/handlers/generate_is_empty_from_len.rs @@ -69,7 +69,7 @@ pub(crate) fn generate_is_empty_from_len( } let node = len_fn.source(ctx.sema.db)?; - let range = node.syntax().value.text_range(); + let range = node.syntax().value.text_range_without_outer_trivia(); acc.add( AssistId::generate("generate_is_empty_from_len"), diff --git a/crates/ide-assists/src/handlers/generate_mut_trait_impl.rs b/crates/ide-assists/src/handlers/generate_mut_trait_impl.rs index 6858b62f8d22..e1b530ddb53e 100644 --- a/crates/ide-assists/src/handlers/generate_mut_trait_impl.rs +++ b/crates/ide-assists/src/handlers/generate_mut_trait_impl.rs @@ -1,11 +1,11 @@ use ide_db::{famous_defs::FamousDefs, traits::resolve_target_trait}; use syntax::{ - AstNode, SyntaxElement, SyntaxNode, T, + AstNode, SyntaxKind, SyntaxNode, T, ast::{self, edit::AstNodeEdit, syntax_factory::SyntaxFactory}, - syntax_editor::{Element, Position, SyntaxEditor}, + syntax_editor::{Position, SyntaxEditor}, }; -use crate::{AssistContext, AssistId, Assists}; +use crate::{AssistContext, AssistId, Assists, utils::insert_before_with_separator}; // FIXME: Generate proper `index_mut` method body refer to `index` method body may impossible due to the unpredictable case [#15581]. // Here just leave the `index_mut` method body be same as `index` method body, user can modify it manually to meet their need. @@ -63,7 +63,7 @@ pub(crate) fn generate_mut_trait_impl( let trait_ = resolve_target_trait(&ctx.sema, &impl_def)?; let trait_new = get_trait_mut(&trait_, famous)?; - let target = impl_def.syntax().text_range(); + let target = impl_def.syntax().text_range_without_outer_trivia(); acc.add( AssistId::generate("generate_mut_trait_impl"), @@ -82,13 +82,11 @@ pub(crate) fn generate_mut_trait_impl( let new_impl = new_impl.indent(indent); let editor = edit.make_editor(impl_def.syntax()); - let make = editor.make(); - editor.insert_all( - Position::before(impl_def.syntax()), - vec![ - new_impl.syntax().syntax_element(), - make.whitespace(&format!("\n\n{indent}")).syntax_element(), - ], + insert_before_with_separator( + &editor, + impl_def.syntax(), + new_impl.syntax(), + &format!("\n\n{indent}"), ); if let Some(cap) = ctx.config.snippet_cap { @@ -102,16 +100,12 @@ pub(crate) fn generate_mut_trait_impl( } fn delete_with_trivia(editor: &SyntaxEditor, node: &SyntaxNode) { - let mut end: SyntaxElement = node.clone().into(); - - if let Some(next) = node.next_sibling_or_token() - && let SyntaxElement::Token(tok) = &next - && tok.kind().is_trivia() + if let Some(next) = node.last_non_trivia_token().and_then(|it| it.next_non_trivia_token()) + && let Some(index) = next.leading_trivia().rposition(|it| it.kind() == SyntaxKind::NEWLINE) { - end = next.clone(); + editor.splice_leading_trivia(&next, ..=index, []); } - - editor.delete_all(node.clone().into()..=end); + editor.delete(node); } fn apply_generate_mut_impl( @@ -175,11 +169,9 @@ fn process_ref_mut(editor: &SyntaxEditor, fn_: &ast::Fn) { let Some(amp) = ref_expr.amp_token() else { return }; - let mut_kw = make.token(T![mut]); - let space = make.whitespace(" "); + let mut_kw = make.with_trailing_trivia(make.token(T![mut]), " "); - editor.insert(Position::after(amp.clone()), space.syntax_element()); - editor.insert(Position::after(amp), mut_kw.syntax_element()); + editor.insert(Position::after(amp), mut_kw); } fn process_ret_type(factory: &SyntaxFactory, ref_ty: &ast::RetType) -> Option { diff --git a/crates/ide-assists/src/handlers/generate_new.rs b/crates/ide-assists/src/handlers/generate_new.rs index 40adfceaae14..2c3131fc9753 100644 --- a/crates/ide-assists/src/handlers/generate_new.rs +++ b/crates/ide-assists/src/handlers/generate_new.rs @@ -67,7 +67,7 @@ pub(crate) fn generate_new(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Op let current_module = ctx.sema.scope(strukt.syntax())?.module(); - let target = strukt.syntax().text_range(); + let target = strukt.syntax().text_range_without_outer_trivia(); acc.add(AssistId::generate("generate_new"), "Generate `new`", target, |builder| { let editor = builder.make_editor(strukt.syntax()); let make = editor.make(); @@ -162,13 +162,15 @@ pub(crate) fn generate_new(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Op if let Some(l_curly) = impl_def.assoc_item_list().and_then(|list| list.l_curly_token()) { - editor.insert_all( + editor.insert( Position::after(l_curly), - vec![ - make.whitespace(&format!("\n{}", impl_def.indent_level() + 1)).into(), - fn_.syntax().clone().into(), - make.whitespace("\n").into(), - ], + make.with_trailing_trivia( + make.with_leading_trivia( + fn_.syntax(), + &format!("\n{}", impl_def.indent_level() + 1), + ), + "\n", + ), ); fn_.syntax().clone() } else { @@ -185,12 +187,9 @@ pub(crate) fn generate_new(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Op .indent(strukt.indent_level()); // Insert it after the adt - editor.insert_all( + editor.insert( Position::after(strukt.syntax()), - vec![ - make.whitespace(&format!("\n\n{indent_level}")).into(), - impl_def.syntax().clone().into(), - ], + make.with_leading_trivia(impl_def.syntax().clone(), &format!("\n\n{indent_level}")), ); impl_def.syntax().clone() }; diff --git a/crates/ide-assists/src/handlers/generate_single_field_struct_from.rs b/crates/ide-assists/src/handlers/generate_single_field_struct_from.rs index 242712ff2ed6..26a2bd570c7f 100644 --- a/crates/ide-assists/src/handlers/generate_single_field_struct_from.rs +++ b/crates/ide-assists/src/handlers/generate_single_field_struct_from.rs @@ -74,7 +74,7 @@ pub(crate) fn generate_single_field_struct_from( acc.add( AssistId::generate("generate_single_field_struct_from"), "Generate single field `From`", - strukt.syntax().text_range(), + strukt.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(strukt.syntax()); let make = editor.make(); @@ -142,12 +142,9 @@ pub(crate) fn generate_single_field_struct_from( .unwrap() .indent_with_mapping(indent, make); - editor.insert_all( + editor.insert( Position::after(strukt.syntax()), - vec![ - make.whitespace(&format!("\n\n{indent}")).into(), - impl_.syntax().clone().into(), - ], + make.with_leading_trivia(impl_.syntax().clone(), &format!("\n\n{indent}")), ); builder.add_file_edits(ctx.vfs_file_id(), editor); }, diff --git a/crates/ide-assists/src/handlers/generate_trait_from_impl.rs b/crates/ide-assists/src/handlers/generate_trait_from_impl.rs index 79254044a960..f6e96da1ae43 100644 --- a/crates/ide-assists/src/handlers/generate_trait_from_impl.rs +++ b/crates/ide-assists/src/handlers/generate_trait_from_impl.rs @@ -1,7 +1,8 @@ use crate::assist_context::{AssistContext, Assists}; +use crate::utils::insert_before_with_separator; use ide_db::{assists::AssistId, defs::Definition, search::SearchScope}; use syntax::{ - AstNode, SyntaxKind, T, + AstNode, T, ast::{ self, HasAttrs, HasGenericParams, HasName, HasVisibility, edit::AstNodeEdit, syntax_factory::SyntaxFactory, @@ -99,7 +100,7 @@ pub(crate) fn generate_trait_from_impl( acc.add( AssistId::generate("generate_trait_from_impl"), "Generate trait from impl", - impl_ast.syntax().text_range(), + impl_ast.syntax().text_range_without_outer_trivia(), |builder| { let trait_items: ast::AssocItemList = { let (trait_items_editor, trait_items) = @@ -129,9 +130,7 @@ pub(crate) fn generate_trait_from_impl( // Change `impl Foo` to `impl NewTrait for Foo` let mut elements = vec![ trait_name_ref.syntax().clone().into(), - make.whitespace(" ").into(), - make.token(T![for]).into(), - make.whitespace(" ").into(), + make.with_trailing_trivia(make.with_leading_trivia(make.token(T![for]), " "), " "), ]; if let Some(params) = params { @@ -147,12 +146,11 @@ pub(crate) fn generate_trait_from_impl( editor.insert_all(Position::before(impl_name.syntax()), elements); // Insert trait before TraitImpl - editor.insert_all( - Position::before(impl_ast.syntax()), - vec![ - trait_ast.syntax().clone().into(), - make.whitespace(&format!("\n\n{}", impl_ast.indent_level())).into(), - ], + insert_before_with_separator( + &editor, + impl_ast.syntax(), + trait_ast.syntax(), + &format!("\n\n{}", impl_ast.indent_level()), ); // Link the trait name & trait ref names together as a placeholder snippet group @@ -178,10 +176,10 @@ fn used_params( .into_iter() .flat_map(|list| list.assoc_items()) .filter_map(|item| match item { - ast::AssocItem::Fn(f) => Some(f.body()?.syntax().text_range()), + ast::AssocItem::Fn(f) => Some(f.body()?.syntax().text_range_without_outer_trivia()), _ => None, }) - .chain(impl_ast.self_ty().map(|it| it.syntax().text_range())) + .chain(impl_ast.self_ty().map(|it| it.syntax().text_range_without_outer_trivia())) .collect::>(); let used_in_impl = |param: &ast::GenericParam| { let Some(def) = ctx.sema.to_def(param) else { return true }; @@ -211,26 +209,15 @@ fn trait_name(items: &ast::AssocItemList, make: &SyntaxFactory) -> ast::Name { /// `E0449` Trait items always share the visibility of their trait fn remove_items_visibility(editor: &SyntaxEditor, item: &ast::AssocItem) { - if let Some(has_vis) = ast::AnyHasVisibility::cast(item.syntax().clone()) { - if let Some(vis) = has_vis.visibility() - && let Some(token) = vis.syntax().next_sibling_or_token() - && token.kind() == SyntaxKind::WHITESPACE - { - editor.delete(token); - } - if let Some(vis) = has_vis.visibility() { - editor.delete(vis.syntax()); - } + if let Some(has_vis) = ast::AnyHasVisibility::cast(item.syntax().clone()) + && let Some(vis) = has_vis.visibility() + { + editor.delete_keeping_leading(vis.syntax()); } } fn remove_doc_comments(editor: &SyntaxEditor, item: &ast::AssocItem) { for doc in item.doc_comments() { - if let Some(next) = doc.syntax().last_token().and_then(|it| it.next_token()) - && next.kind() == SyntaxKind::WHITESPACE - { - editor.delete(next); - } editor.delete(doc.syntax()); } } @@ -242,12 +229,9 @@ fn strip_body(editor: &SyntaxEditor, item: &ast::AssocItem) { { // In contrast to function bodies, we want to see no ws before a semicolon. // So let's remove them if we see any. - if let Some(prev) = body.syntax().prev_sibling_or_token() - && prev.kind() == SyntaxKind::WHITESPACE - { - editor.delete(prev); + if let Some(prev) = body.syntax().prev_non_trivia_token() { + editor.strip_trailing_blank_trivia(&prev); } - editor.replace(body.syntax(), make.token(T![;])); }; } diff --git a/crates/ide-assists/src/handlers/inline_call.rs b/crates/ide-assists/src/handlers/inline_call.rs index 621ac9223abd..a0e8dace5019 100644 --- a/crates/ide-assists/src/handlers/inline_call.rs +++ b/crates/ide-assists/src/handlers/inline_call.rs @@ -90,7 +90,7 @@ pub(crate) fn inline_into_callers(acc: &mut Assists, ctx: &AssistContext<'_, '_> .clone() .in_scope(&SearchScope::file_range(FileRange { file_id: def_file, - range: func_body.syntax().text_range(), + range: func_body.syntax().text_range_without_outer_trivia(), })) .at_least_one(); if is_recursive_fn { @@ -101,7 +101,7 @@ pub(crate) fn inline_into_callers(acc: &mut Assists, ctx: &AssistContext<'_, '_> acc.add( AssistId::refactor_inline("inline_into_callers"), "Inline into all callers", - name.syntax().text_range(), + name.syntax().text_range_without_outer_trivia(), |builder| { let mut usages = usages.all(); let current_file_usage = usages.references.remove(&def_file); @@ -123,11 +123,13 @@ pub(crate) fn inline_into_callers(acc: &mut Assists, ctx: &AssistContext<'_, '_> // Skip calls nested inside other calls being inlined to avoid overlapping // edits. Nested calls are implicitly replaced when the outer call is inlined. - let all_ranges: Vec = - call_infos.iter().map(|ci| ci.node.syntax().text_range()).collect(); + let all_ranges: Vec = call_infos + .iter() + .map(|ci| ci.node.syntax().text_range_without_outer_trivia()) + .collect(); let (call_infos, nested_infos): (Vec<_>, Vec<_>) = call_infos.into_iter().partition(|ci| { - let r = ci.node.syntax().text_range(); + let r = ci.node.syntax().text_range_without_outer_trivia(); !all_ranges.iter().any(|&other| other != r && other.contains_range(r)) }); let nested_count = nested_infos.len(); @@ -172,7 +174,7 @@ pub(crate) fn inline_into_callers(acc: &mut Assists, ctx: &AssistContext<'_, '_> file_editors .entry(vfs_def_file) .or_insert_with(|| builder.make_editor(ast_func.syntax())) - .delete(ast_func.syntax()); + .delete_keeping_edges(ast_func.syntax()); } for (file_id, editor) in file_editors { builder.add_file_edits(file_id, editor); @@ -261,12 +263,17 @@ pub(crate) fn inline_call(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Opt return None; } - acc.add(AssistId::refactor_inline("inline_call"), label, syntax.text_range(), |builder| { - let replacement = - inline(&ctx.sema, file_id, function, &fn_body, ¶ms, &call_info, &editor); - editor.replace(call_info.node.syntax(), replacement.syntax()); - builder.add_file_edits(ctx.vfs_file_id(), editor); - }) + acc.add( + AssistId::refactor_inline("inline_call"), + label, + syntax.text_range_without_outer_trivia(), + |builder| { + let replacement = + inline(&ctx.sema, file_id, function, &fn_body, ¶ms, &call_info, &editor); + editor.replace(call_info.node.syntax(), replacement.syntax()); + builder.add_file_edits(ctx.vfs_file_id(), editor); + }, + ) } struct CallInfo { @@ -374,7 +381,9 @@ fn inline<'db>( .map(|FileReference { name, .. }| match name { FileReferenceNode::NameRef(it) => body .syntax() - .covering_element(it.syntax().text_range() - body_offset) + .covering_element( + it.syntax().text_range_without_outer_trivia() - body_offset, + ) .ancestors() .nth(3) .and_then(ast::PathExpr::cast), @@ -399,9 +408,9 @@ fn inline<'db>( .map(|self_local| { usages_for_locals(self_local) .filter_map(|FileReference { name, .. }| match name { - FileReferenceNode::NameRef(it) => Some( - body.syntax().covering_element(it.syntax().text_range() - body_offset), - ), + FileReferenceNode::NameRef(it) => Some(body.syntax().covering_element( + it.syntax().text_range_without_outer_trivia() - body_offset, + )), _ => None, }) .collect() @@ -431,14 +440,14 @@ fn inline<'db>( // generics aren't valid in expression position. The outermost // `GenericArgList` text is unique within `t`'s text (any inner generics // are nested inside it), so `replacen(.., 1)` is safe. - let stripped = t.syntax().text().to_string().replacen( - &generic_arg_list.syntax().text().to_string(), + let stripped = t.syntax().text_without_outer_trivia().to_string().replacen( + &generic_arg_list.syntax().text_without_outer_trivia().to_string(), "", 1, ); editor.make().ty(&stripped).syntax().clone() } else { - t.syntax().clone() + t.detached().syntax().clone() }; editor.replace(self_tok, replace_with); } @@ -453,7 +462,8 @@ fn inline<'db>( if let Some(node) = has_token.as_node() && let Some(ident_pat) = ast::IdentPat::cast(node.to_owned()) { - func_let_vars.insert(ident_pat.syntax().text().to_string()); + func_let_vars + .insert(ident_pat.syntax().text_without_outer_trivia().to_string()); } } } @@ -465,7 +475,7 @@ fn inline<'db>( .make() .name_ref("this") .syntax() - .first_token() + .first_non_trivia_token() .expect("NameRef should have had a token."); let rewrite_self_to_this = |editor: &SyntaxEditor| { for usage in &self_token_usages { @@ -540,7 +550,7 @@ fn inline<'db>( // check if there is a local var in the function that conflicts with parameter // if it does then emit a let statement and continue - if func_let_vars.contains(&expr.syntax().text().to_string()) { + if func_let_vars.contains(&expr.syntax().text_without_outer_trivia().to_string()) { if is_self_param { rewrite_self_to_this(&editor); } @@ -549,9 +559,10 @@ fn inline<'db>( } let inline_direct = |editor: &SyntaxEditor, usage: &PathExpr, replacement: &ast::Expr| { + let replacement = replacement.detached(); if let Some(field) = path_expr_as_record_field(usage) { cov_mark::hit!(inline_call_inline_direct_field); - field.replace_expr(editor, replacement.clone()); + field.replace_expr(editor, replacement); } else { editor.replace(usage.syntax(), replacement.syntax()); } @@ -633,14 +644,14 @@ fn inline<'db>( ast::CallableExpr::Call(it) => it.indent_level(), ast::CallableExpr::MethodCall(it) => it.indent_level(), }; - body = body.dedent(original_body_indent).indent(original_indentation); + body = body.dedent(original_body_indent).indent(original_indentation).detached(); let no_stmts = body.statements().next().is_none(); match body.tail_expr() { Some(expr) if matches!(expr, ast::Expr::ClosureExpr(_)) && no_stmts => { make.expr_paren(expr).into() } - Some(expr) if !is_async_fn && no_stmts => expr, + Some(expr) if !is_async_fn && no_stmts => expr.detached(), _ => match node .syntax() .parent() diff --git a/crates/ide-assists/src/handlers/inline_const_as_literal.rs b/crates/ide-assists/src/handlers/inline_const_as_literal.rs index 46cedea96781..4ba7ca4ca2eb 100644 --- a/crates/ide-assists/src/handlers/inline_const_as_literal.rs +++ b/crates/ide-assists/src/handlers/inline_const_as_literal.rs @@ -50,10 +50,10 @@ pub(crate) fn inline_const_as_literal( let id = AssistId::refactor_inline("inline_const_as_literal"); let label = "Inline const as literal".to_owned(); - let target = variable.syntax().text_range(); + let target = variable.syntax().text_range_without_outer_trivia(); return acc.add(id, label, target, |edit| { - edit.replace(variable.syntax().text_range(), value); + edit.replace(variable.syntax().text_range_without_outer_trivia(), value); }); } None diff --git a/crates/ide-assists/src/handlers/inline_local_variable.rs b/crates/ide-assists/src/handlers/inline_local_variable.rs index 7a82e8b2f3ac..b25327be5c4b 100644 --- a/crates/ide-assists/src/handlers/inline_local_variable.rs +++ b/crates/ide-assists/src/handlers/inline_local_variable.rs @@ -6,9 +6,9 @@ use ide_db::{ search::{FileReference, UsageSearchResult}, }; use syntax::{ - Direction, T, TextRange, - ast::{self, AstNode, AstToken, HasName}, - syntax_editor::{Element, Position, SyntaxEditor}, + T, TextRange, + ast::{self, AstNode, HasName, edit::AstNodeEdit}, + syntax_editor::Position, }; use crate::{ @@ -80,20 +80,14 @@ pub(crate) fn inline_local_variable(acc: &mut Assists, ctx: &AssistContext<'_, ' && let Some(op_token) = bin_expr.op_token() { editor.delete(&op_token); - remove_whitespace(op_token, Direction::Prev, &editor); - remove_whitespace(place.start(), Direction::Prev, &editor); - } else { - remove_whitespace(place.end(), Direction::Next, &editor); } } for FileReference { range, name, .. } in references { let Some(name) = name.as_name_ref().cloned() else { continue }; - let replacement = if needs_parens(&name) { - make.expr_paren(initializer_expr.clone()).into() - } else { - initializer_expr.clone() - }; + let detached = initializer_expr.detached(); + let replacement = + if needs_parens(&name) { make.expr_paren(detached).into() } else { detached }; let place = cover_edit_range(source, range); if ast::RecordExprField::for_field_name(&name).is_some() { @@ -102,8 +96,7 @@ pub(crate) fn inline_local_variable(acc: &mut Assists, ctx: &AssistContext<'_, ' Position::after(place.end()), vec![ make.token(T![:]).into(), - make.whitespace(" ").into(), - replacement.syntax().clone().into(), + make.with_leading_trivia(replacement.syntax().clone(), " "), ], ); } else { @@ -196,23 +189,6 @@ fn inline_usage( Some(InlineData { let_stmt, delete_let, target, references }) } -fn remove_whitespace(elem: impl Element, dir: Direction, editor: &SyntaxEditor) { - let token = match elem.syntax_element() { - syntax::NodeOrToken::Node(node) => match dir { - Direction::Next => node.last_token(), - Direction::Prev => node.first_token(), - }, - syntax::NodeOrToken::Token(t) => Some(t), - }; - let next_token = match dir { - Direction::Next => token.and_then(|it| it.next_token()), - Direction::Prev => token.and_then(|it| it.prev_token()), - }; - if let Some(whitespace) = next_token.and_then(ast::Whitespace::cast) { - editor.delete(whitespace.syntax()); - } -} - #[cfg(test)] mod tests { use crate::tests::{check_assist, check_assist_not_applicable}; diff --git a/crates/ide-assists/src/handlers/inline_type_alias.rs b/crates/ide-assists/src/handlers/inline_type_alias.rs index f5d5400404cf..30a0d68e151e 100644 --- a/crates/ide-assists/src/handlers/inline_type_alias.rs +++ b/crates/ide-assists/src/handlers/inline_type_alias.rs @@ -11,7 +11,7 @@ use itertools::Itertools; use syntax::ast::syntax_factory::SyntaxFactory; use syntax::syntax_editor::SyntaxEditor; use syntax::{ - AstNode, NodeOrToken, SyntaxKind, SyntaxNode, T, + AstNode, NodeOrToken, SyntaxNode, T, ast::{self, HasGenericParams, HasName}, }; @@ -62,7 +62,7 @@ pub(crate) fn inline_type_alias_uses(acc: &mut Assists, ctx: &AssistContext<'_, acc.add( AssistId::refactor_inline("inline_type_alias_uses"), "Inline type alias into all uses", - name.syntax().text_range(), + name.syntax().text_range_without_outer_trivia(), |builder| { let usages = usages.all(); let mut definition_deleted = false; @@ -88,7 +88,7 @@ pub(crate) fn inline_type_alias_uses(acc: &mut Assists, ctx: &AssistContext<'_, } if file_id.file_id(ctx.db()) == ctx.vfs_file_id() { - editor.delete(ast_alias.syntax()); + editor.delete_keeping_edges(ast_alias.syntax()); definition_deleted = true; } builder.add_file_edits(file_id.file_id(ctx.db()), editor); @@ -99,7 +99,7 @@ pub(crate) fn inline_type_alias_uses(acc: &mut Assists, ctx: &AssistContext<'_, } if !definition_deleted { let editor = builder.make_editor(ast_alias.syntax()); - editor.delete(ast_alias.syntax()); + editor.delete_keeping_edges(ast_alias.syntax()); builder.add_file_edits(ctx.vfs_file_id(), editor) } }, @@ -164,7 +164,7 @@ pub(crate) fn inline_type_alias(acc: &mut Assists, ctx: &AssistContext<'_, '_>) acc.add( AssistId::refactor_inline("inline_type_alias"), "Inline type alias", - alias_instance.syntax().text_range(), + alias_instance.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(alias_instance.syntax()); let replace = replacement.replace_generic(&concrete_type); @@ -362,11 +362,6 @@ fn create_replacement( continue; } removals.push(NodeOrToken::Node(syntax.clone())); - if let Some(ws) = syntax.next_sibling_or_token() - && ws.kind() == SyntaxKind::WHITESPACE - { - removals.push(ws); - } continue; } diff --git a/crates/ide-assists/src/handlers/into_to_qualified_from.rs b/crates/ide-assists/src/handlers/into_to_qualified_from.rs index 9f8b08f4f80b..b32dd35bf887 100644 --- a/crates/ide-assists/src/handlers/into_to_qualified_from.rs +++ b/crates/ide-assists/src/handlers/into_to_qualified_from.rs @@ -59,10 +59,10 @@ pub(crate) fn into_to_qualified_from(acc: &mut Assists, ctx: &AssistContext<'_, acc.add( AssistId::generate("into_to_qualified_from"), "Convert `into` to fully qualified `from`", - nameref.syntax().text_range(), + nameref.syntax().text_range_without_outer_trivia(), |edit| { edit.replace( - method_call.syntax().text_range(), + method_call.syntax().text_range_without_outer_trivia(), if sc.chars().all(|c| c.is_alphanumeric() || c == ':') { format!("{sc}::from({receiver})") } else { diff --git a/crates/ide-assists/src/handlers/introduce_named_lifetime.rs b/crates/ide-assists/src/handlers/introduce_named_lifetime.rs index 986989952f67..dfddc5af9256 100644 --- a/crates/ide-assists/src/handlers/introduce_named_lifetime.rs +++ b/crates/ide-assists/src/handlers/introduce_named_lifetime.rs @@ -62,7 +62,7 @@ fn generate_unique_lifetime_param_name( let used_lifetime_param: FxHashSet = existing_params .iter() .flat_map(|params| params.lifetime_params()) - .map(|p| p.syntax().text().to_smolstr()) + .map(|p| p.syntax().text_without_outer_trivia().to_smolstr()) .collect(); ('a'..='z').map(|c| format_smolstr!("'{c}")).find(|lt| !used_lifetime_param.contains(lt)) } @@ -112,12 +112,9 @@ fn generate_fn_def_assist( editor.replace(lifetime.syntax(), make.lifetime(&new_lifetime_name).syntax()); if let Some(pos) = loc_needing_lifetime.and_then(|l| l.to_position()) { - editor.insert_all( + editor.insert( pos, - vec![ - make.lifetime(&new_lifetime_name).syntax().clone().into(), - make.whitespace(" ").into(), - ], + make.with_trailing_trivia(make.lifetime(&new_lifetime_name).syntax().clone(), " "), ); } @@ -216,8 +213,7 @@ fn insert_lifetime_param( let mut elements = Vec::new(); if needs_comma { - elements.push(make.token(T![,]).syntax_element()); - elements.push(make.whitespace(" ").syntax_element()); + elements.push(make.with_trailing_trivia(make.token(T![,]), " ")); } let lifetime = make.lifetime(lifetime_name); diff --git a/crates/ide-assists/src/handlers/introduce_named_type_parameter.rs b/crates/ide-assists/src/handlers/introduce_named_type_parameter.rs index 427fbbeaa0e9..b382f9df777f 100644 --- a/crates/ide-assists/src/handlers/introduce_named_type_parameter.rs +++ b/crates/ide-assists/src/handlers/introduce_named_type_parameter.rs @@ -24,7 +24,7 @@ pub(crate) fn introduce_named_type_parameter( let fn_ = param.syntax().ancestors().nth(2).and_then(ast::Fn::cast)?; let type_bound_list = impl_trait_type.type_bound_list()?; - let target = fn_.syntax().text_range(); + let target = fn_.syntax().text_range_without_outer_trivia(); acc.add( AssistId::refactor_rewrite("introduce_named_type_parameter"), "Replace impl trait with type parameter", @@ -65,7 +65,10 @@ pub(crate) fn introduce_named_type_parameter( } fn non_default_bounds(bounds: &ast::TypeBoundList) -> bool { - bounds.bounds().collect_array().is_none_or(|[bound]| bound.syntax().text() != "Sized") + bounds + .bounds() + .collect_array() + .is_none_or(|[bound]| bound.syntax().text_without_outer_trivia() != "Sized") } #[cfg(test)] diff --git a/crates/ide-assists/src/handlers/invert_if.rs b/crates/ide-assists/src/handlers/invert_if.rs index f50ccc3e1136..610d91c037df 100644 --- a/crates/ide-assists/src/handlers/invert_if.rs +++ b/crates/ide-assists/src/handlers/invert_if.rs @@ -55,11 +55,11 @@ pub(crate) fn invert_if(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Optio edit.replace_ast(cond, flip_cond); let else_node = else_block.syntax(); - let else_range = else_node.text_range(); - let then_range = then_node.text_range(); + let else_range = else_node.text_range_without_outer_trivia(); + let then_range = then_node.text_range_without_outer_trivia(); - edit.replace(else_range, then_node.text()); - edit.replace(then_range, else_node.text()); + edit.replace(else_range, then_node.text_without_outer_trivia().to_string()); + edit.replace(then_range, else_node.text_without_outer_trivia().to_string()); }) } diff --git a/crates/ide-assists/src/handlers/merge_imports.rs b/crates/ide-assists/src/handlers/merge_imports.rs index a4edb556d457..6b7b268e0ae6 100644 --- a/crates/ide-assists/src/handlers/merge_imports.rs +++ b/crates/ide-assists/src/handlers/merge_imports.rs @@ -32,7 +32,7 @@ pub(crate) fn merge_imports(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> O // Merge a neighbor cov_mark::hit!(merge_with_use_item_neighbors); let tree = ctx.find_node_at_offset::()?.top_use_tree(); - let target = tree.syntax().text_range(); + let target = tree.syntax().text_range_without_outer_trivia(); let use_item = tree.syntax().parent().and_then(ast::Use::cast)?; let neighbor = next_prev().find_map(|dir| neighbor(&use_item, dir))?; diff --git a/crates/ide-assists/src/handlers/merge_match_arms.rs b/crates/ide-assists/src/handlers/merge_match_arms.rs index 5060886cfa9c..f31529e5411d 100644 --- a/crates/ide-assists/src/handlers/merge_match_arms.rs +++ b/crates/ide-assists/src/handlers/merge_match_arms.rs @@ -40,10 +40,11 @@ pub(crate) fn merge_match_arms(acc: &mut Assists, ctx: &AssistContext<'_, '_>) - return None; } let current_expr = current_arm.expr()?; - let current_text_range = current_arm.syntax().text_range(); + let current_text_range = current_arm.syntax().text_range_without_outer_trivia(); let current_arm_types = get_arm_types(ctx, ¤t_arm); let multi_arm_selection = !ctx.has_empty_selection() - && ctx.selection_trimmed().end() > current_arm.syntax().text_range().end(); + && ctx.selection_trimmed().end() + > current_arm.syntax().text_range_without_outer_trivia().end(); // We check if the following match arms match this one. We could, but don't, // compare to the previous match arm as well. @@ -52,12 +53,14 @@ pub(crate) fn merge_match_arms(acc: &mut Assists, ctx: &AssistContext<'_, '_>) - Some(expr) if arm.guard().is_none() => { // don't include match arms that start after our selection if multi_arm_selection - && arm.syntax().text_range().start() >= ctx.selection_trimmed().end() + && arm.syntax().text_range_without_outer_trivia().start() + >= ctx.selection_trimmed().end() { return false; } - let same_text = expr.syntax().text() == current_expr.syntax().text(); + let same_text = expr.syntax().text_without_outer_trivia() + == current_expr.syntax().text_without_outer_trivia(); if !same_text { return false; } @@ -83,7 +86,7 @@ pub(crate) fn merge_match_arms(acc: &mut Assists, ctx: &AssistContext<'_, '_>) - arms_to_merge .iter() .filter_map(ast::MatchArm::pat) - .map(|x| x.syntax().to_string()) + .map(|x| x.syntax().text_without_outer_trivia().to_string()) .collect::>() .join(" | ") }; @@ -91,8 +94,8 @@ pub(crate) fn merge_match_arms(acc: &mut Assists, ctx: &AssistContext<'_, '_>) - let arm = format!("{pats} => {current_expr},"); if let [first, .., last] = &*arms_to_merge { - let start = first.syntax().text_range().start(); - let end = last.syntax().text_range().end(); + let start = first.syntax().text_range_without_outer_trivia().start(); + let end = last.syntax().text_range_without_outer_trivia().end(); edit.replace(TextRange::new(start, end), arm); } diff --git a/crates/ide-assists/src/handlers/merge_nested_if.rs b/crates/ide-assists/src/handlers/merge_nested_if.rs index bb3725a13388..ab1580c913a9 100644 --- a/crates/ide-assists/src/handlers/merge_nested_if.rs +++ b/crates/ide-assists/src/handlers/merge_nested_if.rs @@ -39,7 +39,7 @@ pub(crate) fn merge_nested_if(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> let cond = expr.condition()?; - let cond_range = cond.syntax().text_range(); + let cond_range = cond.syntax().text_range_without_outer_trivia(); //check if the then branch is a nested if let then_branch = expr.then_branch()?; @@ -62,21 +62,21 @@ pub(crate) fn merge_nested_if(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> acc.add(AssistId::refactor_rewrite("merge_nested_if"), "Merge nested if", if_range, |edit| { let cond_text = if has_logic_op_or(&cond) { - format!("({})", cond.syntax().text()) + format!("({})", cond.syntax().text_without_outer_trivia()) } else { - cond.syntax().text().to_string() + cond.syntax().text_without_outer_trivia().to_string() }; let nested_if_cond_text = if has_logic_op_or(&nested_if_cond) { - format!("({})", nested_if_cond.syntax().text()) + format!("({})", nested_if_cond.syntax().text_without_outer_trivia()) } else { - nested_if_cond.syntax().text().to_string() + nested_if_cond.syntax().text_without_outer_trivia().to_string() }; let replace_cond = format!("{cond_text} && {nested_if_cond_text}"); edit.replace(cond_range, replace_cond); - edit.replace_ast(then_branch, nested_if_then_branch.dedent(1.into())); + edit.replace_ast(then_branch, nested_if_then_branch.dedent(1.into()).detached()); }) } diff --git a/crates/ide-assists/src/handlers/move_bounds.rs b/crates/ide-assists/src/handlers/move_bounds.rs index 3efc847141c7..c887d8a8aab7 100644 --- a/crates/ide-assists/src/handlers/move_bounds.rs +++ b/crates/ide-assists/src/handlers/move_bounds.rs @@ -39,7 +39,7 @@ pub(crate) fn move_bounds_to_where_clause( let parent = type_param_list.syntax().parent()?; - let target = type_param_list.syntax().text_range(); + let target = type_param_list.syntax().text_range_without_outer_trivia(); acc.add( AssistId::refactor_rewrite("move_bounds_to_where_clause"), "Move to where clause", diff --git a/crates/ide-assists/src/handlers/move_const_to_impl.rs b/crates/ide-assists/src/handlers/move_const_to_impl.rs index 4071f16a9fb4..eee201277557 100644 --- a/crates/ide-assists/src/handlers/move_const_to_impl.rs +++ b/crates/ide-assists/src/handlers/move_const_to_impl.rs @@ -1,7 +1,7 @@ use hir::{AsAssocItem, AssocItemContainer, FileRange, HasSource}; use ide_db::{assists::AssistId, defs::Definition, search::SearchScope}; use syntax::{ - SyntaxKind, + SyntaxKind, TextRange, ast::{ self, AstNode, edit::{AstNodeEdit, IndentLevel}, @@ -47,7 +47,7 @@ pub(crate) fn move_const_to_impl(acc: &mut Assists, ctx: &AssistContext<'_, '_>) let const_: ast::Const = ctx.find_node_at_offset()?; // Don't show the assist when the cursor is at the const's body. if let Some(body) = const_.body() - && body.syntax().text_range().contains(ctx.offset()) + && body.syntax().text_range_without_outer_trivia().contains(ctx.offset()) { return None; } @@ -88,22 +88,36 @@ pub(crate) fn move_const_to_impl(acc: &mut Assists, ctx: &AssistContext<'_, '_>) acc.add( AssistId::refactor_rewrite("move_const_to_impl"), "Move const to impl block", - const_.syntax().text_range(), + const_.syntax().text_range_without_outer_trivia(), |builder| { let usages = Definition::Const(def) .usages(&ctx.sema) .in_scope(&SearchScope::file_range(FileRange { file_id: ctx.file_id(), - range: parent_fn.syntax().text_range(), + range: parent_fn.syntax().text_range_without_outer_trivia(), })) .all(); - let range_to_delete = match const_.syntax().next_sibling_or_token() { - Some(s) if matches!(s.kind(), SyntaxKind::WHITESPACE) => { - // Remove following whitespaces too. - const_.syntax().text_range().cover(s.text_range()) + let range_to_delete = { + let trimmed = const_.syntax().text_range_without_outer_trivia(); + match const_ + .syntax() + .last_non_trivia_token() + .and_then(|last| { + let next = last.next_non_trivia_token()?; + let comment = last + .trailing_trivia() + .chain(next.leading_trivia()) + .find(|it| it.kind() == SyntaxKind::COMMENT); + Some( + comment.map_or(next.text_range().start(), |it| it.text_range().start()), + ) + }) + .filter(|end| *end > trimmed.end()) + { + Some(end) => TextRange::new(trimmed.start(), end), + None => trimmed, } - _ => const_.syntax().text_range(), }; builder.delete(range_to_delete); @@ -122,12 +136,12 @@ pub(crate) fn move_const_to_impl(acc: &mut Assists, ctx: &AssistContext<'_, '_>) let last_const = items.assoc_items().take_while(|it| matches!(it, ast::AssocItem::Const(_))).last(); let insert_offset = match &last_const { - Some(it) => it.syntax().text_range().end(), + Some(it) => it.syntax().text_range_without_outer_trivia().end(), None => match items.l_curly_token() { Some(l_curly) => l_curly.text_range().end(), // Not sure if this branch is ever reachable, but it wouldn't hurt to have a // fallback. - None => items.syntax().text_range().start(), + None => items.syntax().text_range_without_outer_trivia().start(), }, }; diff --git a/crates/ide-assists/src/handlers/move_from_mod_rs.rs b/crates/ide-assists/src/handlers/move_from_mod_rs.rs index 21a8c53e8c9b..cf2f97035b8e 100644 --- a/crates/ide-assists/src/handlers/move_from_mod_rs.rs +++ b/crates/ide-assists/src/handlers/move_from_mod_rs.rs @@ -25,7 +25,8 @@ pub(crate) fn move_from_mod_rs(acc: &mut Assists, ctx: &AssistContext<'_, '_>) - let module = ctx.sema.file_to_module_def(ctx.vfs_file_id())?; // Enable this assist if the user select all "meaningful" content in the source file let trimmed_selected_range = trimmed_text_range(&source_file, ctx.selection_trimmed()); - let trimmed_file_range = trimmed_text_range(&source_file, source_file.syntax().text_range()); + let trimmed_file_range = + trimmed_text_range(&source_file, source_file.syntax().text_range_without_outer_trivia()); if !module.is_mod_rs(ctx.db()) { cov_mark::hit!(not_mod_rs); return None; @@ -35,7 +36,7 @@ pub(crate) fn move_from_mod_rs(acc: &mut Assists, ctx: &AssistContext<'_, '_>) - return None; } - let target = source_file.syntax().text_range(); + let target = source_file.syntax().text_range_without_outer_trivia(); let module_name = module.name(ctx.db())?.as_str().to_smolstr(); let path = format!("../{module_name}.rs"); let dst = AnchoredPathBuf { anchor: ctx.vfs_file_id(), path }; diff --git a/crates/ide-assists/src/handlers/move_guard.rs b/crates/ide-assists/src/handlers/move_guard.rs index 7cd0d0123847..9759af9c0b6f 100644 --- a/crates/ide-assists/src/handlers/move_guard.rs +++ b/crates/ide-assists/src/handlers/move_guard.rs @@ -1,12 +1,10 @@ -use itertools::{Itertools, chain}; +use itertools::chain; use syntax::{ - SyntaxKind::WHITESPACE, - TextRange, + SyntaxKind, TextRange, ast::{ AstNode, BlockExpr, ElseBranch, Expr, IfExpr, MatchArm, Pat, edit::AstNodeEdit, prec::ExprPrecedence, syntax_factory::SyntaxFactory, }, - syntax_editor::Element, }; use crate::{AssistContext, AssistId, Assists}; @@ -41,16 +39,11 @@ use crate::{AssistContext, AssistId, Assists}; pub(crate) fn move_guard_to_arm_body(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Option<()> { let match_arm = ctx.find_node_at_offset::()?; let guard = match_arm.guard()?; - if ctx.offset() > guard.syntax().text_range().end() { + if ctx.offset() > guard.syntax().text_range_without_outer_trivia().end() { cov_mark::hit!(move_guard_inapplicable_in_arm_body); return None; } let rest_arms = rest_arms(&match_arm, ctx.selection_trimmed())?; - let space_before_delete = chain( - guard.syntax().prev_sibling_or_token(), - rest_arms.iter().filter_map(|it| it.syntax().prev_sibling_or_token()), - ); - let space_after_arrow = match_arm.fat_arrow_token()?.next_sibling_or_token(); let arm_expr = match_arm.expr()?; let make = SyntaxFactory::without_mappings(); @@ -67,29 +60,28 @@ pub(crate) fn move_guard_to_arm_body(acc: &mut Assists, ctx: &AssistContext<'_, .indent(arm_expr.indent_level()); let ElseBranch::IfExpr(if_expr) = if_branch else { return None }; - let target = guard.syntax().text_range(); + let target = guard.syntax().text_range_without_outer_trivia(); acc.add( AssistId::refactor_rewrite("move_guard_to_arm_body"), "Move guard to arm body", target, |builder| { let editor = builder.make_editor(match_arm.syntax()); - for element in space_before_delete { - if element.kind() == WHITESPACE { - editor.delete(element); - } - } for rest_arm in &rest_arms { - editor.delete(rest_arm.syntax()); + editor.delete_keeping_lines(rest_arm.syntax()); } - if let Some(element) = space_after_arrow - && element.kind() == WHITESPACE + if let Some(prev) = + guard.syntax().first_non_trivia_token().and_then(|it| it.prev_non_trivia_token()) { - editor.replace(element, make.whitespace(" ")); + editor.strip_trailing_blank_trivia(&prev); + } + if let Some(arrow) = match_arm.fat_arrow_token() { + editor.splice_leading_trivia(&arrow, .., [(SyntaxKind::WHITESPACE, " ")]); + editor.splice_trailing_trivia(&arrow, .., [(SyntaxKind::WHITESPACE, " ")]); } editor.delete(guard.syntax()); - editor.replace(arm_expr.syntax(), if_expr.syntax()); + editor.replace_verbatim(arm_expr.syntax(), if_expr.syntax()); builder.add_file_edits(ctx.vfs_file_id(), editor); }, ) @@ -143,7 +135,7 @@ pub(crate) fn move_arm_cond_to_match_guard( None } })?; - if ctx.offset() > if_expr.then_branch()?.syntax().text_range().start() { + if ctx.offset() > if_expr.then_branch()?.syntax().text_range_without_outer_trivia().start() { return None; } @@ -228,9 +220,10 @@ pub(crate) fn move_arm_cond_to_match_guard( } } - let newline = make.whitespace(&format!("\n{indent_level}")); - let replace_arms = replace_arms.iter().map(|it| it.syntax().syntax_element()); - let replace_arms = Itertools::intersperse(replace_arms, newline.syntax_element()); + let separator = format!("\n{indent_level}"); + let replace_arms = replace_arms.iter().enumerate().map(|(index, it)| { + make.with_leading_trivia(it.syntax(), if index == 0 { "" } else { &separator }) + }); editor.replace_with_many(match_arm.syntax(), replace_arms.collect()); builder.add_file_edits(ctx.vfs_file_id(), editor); @@ -249,9 +242,9 @@ fn rest_arms(match_arm: &MatchArm, selection: TextRange) -> Option selection.is_empty() || crate::utils::is_selected(it, selection, false) }) .take_while(move |it| { - it.pat() - .zip(match_arm.pat()) - .is_some_and(|(a, b)| a.syntax().text() == b.syntax().text()) + it.pat().zip(match_arm.pat()).is_some_and(|(a, b)| { + a.syntax().text_without_outer_trivia() == b.syntax().text_without_outer_trivia() + }) }) .collect::>() .into() diff --git a/crates/ide-assists/src/handlers/move_module_to_file.rs b/crates/ide-assists/src/handlers/move_module_to_file.rs index 3fec10227535..b13d5ee0e1ed 100644 --- a/crates/ide-assists/src/handlers/move_module_to_file.rs +++ b/crates/ide-assists/src/handlers/move_module_to_file.rs @@ -28,12 +28,15 @@ pub(crate) fn move_module_to_file(acc: &mut Assists, ctx: &AssistContext<'_, '_> let module_ast = ctx.find_node_at_offset::()?; let module_items = module_ast.item_list()?; - let l_curly_offset = module_items.syntax().text_range().start(); + let l_curly_offset = module_items.syntax().text_range_without_outer_trivia().start(); if l_curly_offset <= ctx.offset() { cov_mark::hit!(available_before_curly); return None; } - let target = TextRange::new(module_ast.syntax().text_range().start(), l_curly_offset); + let target = TextRange::new( + module_ast.syntax().text_range_without_outer_trivia().start(), + l_curly_offset, + ); let module_name = module_ast.name()?; @@ -87,12 +90,15 @@ pub(crate) fn move_module_to_file(acc: &mut Assists, ctx: &AssistContext<'_, '_> let replacement_start = match module_ast.mod_token() { Some(mod_token) => mod_token.text_range(), - None => module_ast.syntax().text_range(), + None => module_ast.syntax().text_range_without_outer_trivia(), } .start(); builder.replace( - TextRange::new(replacement_start, module_ast.syntax().text_range().end()), + TextRange::new( + replacement_start, + module_ast.syntax().text_range_without_outer_trivia().end(), + ), buf, ); diff --git a/crates/ide-assists/src/handlers/move_to_mod_rs.rs b/crates/ide-assists/src/handlers/move_to_mod_rs.rs index 7407bd1a0c29..e5a597799ded 100644 --- a/crates/ide-assists/src/handlers/move_to_mod_rs.rs +++ b/crates/ide-assists/src/handlers/move_to_mod_rs.rs @@ -25,7 +25,8 @@ pub(crate) fn move_to_mod_rs(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> let module = ctx.sema.file_to_module_def(ctx.vfs_file_id())?; // Enable this assist if the user select all "meaningful" content in the source file let trimmed_selected_range = trimmed_text_range(&source_file, ctx.selection_trimmed()); - let trimmed_file_range = trimmed_text_range(&source_file, source_file.syntax().text_range()); + let trimmed_file_range = + trimmed_text_range(&source_file, source_file.syntax().text_range_without_outer_trivia()); if module.is_mod_rs(ctx.db()) { cov_mark::hit!(already_mod_rs); return None; @@ -35,7 +36,7 @@ pub(crate) fn move_to_mod_rs(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> return None; } - let target = source_file.syntax().text_range(); + let target = source_file.syntax().text_range_without_outer_trivia(); let module_name = module.name(ctx.db())?.as_str().to_smolstr(); let path = format!("./{module_name}/mod.rs"); let dst = AnchoredPathBuf { anchor: ctx.vfs_file_id(), path }; diff --git a/crates/ide-assists/src/handlers/normalize_import.rs b/crates/ide-assists/src/handlers/normalize_import.rs index b53f0fc941c3..d7aae687d6c0 100644 --- a/crates/ide-assists/src/handlers/normalize_import.rs +++ b/crates/ide-assists/src/handlers/normalize_import.rs @@ -24,7 +24,7 @@ pub(crate) fn normalize_import(acc: &mut Assists, ctx: &AssistContext<'_, '_>) - ctx.covering_element().ancestors().find_map(ast::Use::cast)? }; - let target = use_item.syntax().text_range(); + let target = use_item.syntax().text_range_without_outer_trivia(); let (editor, _) = SyntaxEditor::new(use_item.syntax().tree_top()); let normalized_use_item = try_normalize_import(editor.make(), &use_item, ctx.config.insert_use.granularity.into())?; diff --git a/crates/ide-assists/src/handlers/promote_local_to_const.rs b/crates/ide-assists/src/handlers/promote_local_to_const.rs index 5dcda1deb01f..6269eefba1a8 100644 --- a/crates/ide-assists/src/handlers/promote_local_to_const.rs +++ b/crates/ide-assists/src/handlers/promote_local_to_const.rs @@ -71,7 +71,7 @@ pub(crate) fn promote_local_to_const(acc: &mut Assists, ctx: &AssistContext<'_, acc.add( AssistId::refactor("promote_local_to_const"), "Promote local to constant", - let_stmt.syntax().text_range(), + let_stmt.syntax().text_range_without_outer_trivia(), |edit| { let editor = edit.make_editor(let_stmt.syntax()); let make = editor.make(); @@ -87,7 +87,7 @@ pub(crate) fn promote_local_to_const(acc: &mut Assists, ctx: &AssistContext<'_, utils::replace_record_field_expr(ctx, edit, record_field, name_expr); } else { let usage_range = usage.range; - edit.replace(usage_range, name_ref.syntax().text()); + edit.replace(usage_range, name_ref.syntax().text_without_outer_trivia()); } } } diff --git a/crates/ide-assists/src/handlers/pull_assignment_up.rs b/crates/ide-assists/src/handlers/pull_assignment_up.rs index 4024d51ffc79..b7366cf5cef1 100644 --- a/crates/ide-assists/src/handlers/pull_assignment_up.rs +++ b/crates/ide-assists/src/handlers/pull_assignment_up.rs @@ -68,8 +68,9 @@ pub(crate) fn pull_assignment_up(acc: &mut Assists, ctx: &AssistContext<'_, '_>) { return None; } - let target = tgt.syntax().text_range(); + let target = tgt.syntax().text_range_without_outer_trivia(); + let base = tgt.syntax().text_range().start(); let (editor, edit_tgt) = SyntaxEditor::new(tgt.syntax().clone()); let assignments: Vec<_> = collector .assignments @@ -78,11 +79,11 @@ pub(crate) fn pull_assignment_up(acc: &mut Assists, ctx: &AssistContext<'_, '_>) Some(( find_node_at_range::( &edit_tgt, - stmt.syntax().text_range() - target.start(), + stmt.syntax().text_range_without_outer_trivia() - base, )?, find_node_at_range::( &edit_tgt, - rhs.syntax().text_range() - target.start(), + rhs.syntax().text_range_without_outer_trivia() - base, )?, )) }) diff --git a/crates/ide-assists/src/handlers/qualify_method_call.rs b/crates/ide-assists/src/handlers/qualify_method_call.rs index edf0a855c4fe..8aec99c5fd9e 100644 --- a/crates/ide-assists/src/handlers/qualify_method_call.rs +++ b/crates/ide-assists/src/handlers/qualify_method_call.rs @@ -38,7 +38,7 @@ pub(crate) fn qualify_method_call(acc: &mut Assists, ctx: &AssistContext<'_, '_> let ident = name.ident_token()?; - let range = call.syntax().text_range(); + let range = call.syntax().text_range_without_outer_trivia(); let resolved_call = ctx.sema.resolve_method_call(&call)?; let current_module = ctx.sema.scope(call.syntax())?.module(); diff --git a/crates/ide-assists/src/handlers/remove_dbg.rs b/crates/ide-assists/src/handlers/remove_dbg.rs index 91977c2b7fa2..c85638c055f9 100644 --- a/crates/ide-assists/src/handlers/remove_dbg.rs +++ b/crates/ide-assists/src/handlers/remove_dbg.rs @@ -1,9 +1,9 @@ use itertools::Itertools; use syntax::{ - Edition, NodeOrToken, SyntaxNode, SyntaxToken, T, + Edition, NodeOrToken, SyntaxElement, T, ast::{self, AstNode, syntax_factory::SyntaxFactory}, match_ast, - syntax_editor::{Position, SyntaxEditor}, + syntax_editor::SyntaxEditor, }; use crate::{AssistContext, AssistId, Assists}; @@ -32,7 +32,9 @@ pub(crate) fn remove_dbg(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Opti ctx.covering_element() .as_node()? .descendants() - .filter(|node| ctx.selection_trimmed().contains_range(node.text_range())) + .filter(|node| { + ctx.selection_trimmed().contains_range(node.text_range_without_outer_trivia()) + }) // When the selection exactly covers the macro call to be removed, `covering_element()` // returns `ast::MacroCall` instead of its parent `ast::MacroExpr` that we want. So // first try finding `ast::MacroCall`s and then retrieve their parent. @@ -47,16 +49,13 @@ pub(crate) fn remove_dbg(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Opti .collect::>(); let target = replacements .iter() - .flat_map(|(node_or_token, _)| node_or_token.iter()) - .map(|t| t.text_range()) + .map(|(element, _)| element.text_range()) .reduce(|acc, range| acc.cover(range))?; acc.add(AssistId::quick_fix("remove_dbg"), "Remove dbg!()", target, |builder| { - for (range, expr) in replacements { - if let Some(expr) = expr { - editor.insert(Position::before(range[0].clone()), expr.syntax()); - } - for node_or_token in range { - editor.delete(node_or_token); + for (element, expr) in replacements { + match expr { + Some(expr) => editor.replace(element, expr.syntax()), + None => editor.delete_keeping_lines(element), } } builder.add_file_edits(ctx.vfs_file_id(), editor); @@ -72,7 +71,7 @@ pub(crate) fn remove_dbg(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Opti fn compute_dbg_replacement( macro_expr: ast::MacroExpr, make: &SyntaxFactory, -) -> Option<(Vec>, Option)> { +) -> Option<(SyntaxElement, Option)> { let macro_call = macro_expr.macro_call()?; let tt = macro_call.token_tree()?; let r_delim = NodeOrToken::Token(tt.right_delimiter_token()?); @@ -88,50 +87,38 @@ fn compute_dbg_replacement( .into_iter() .filter_map(|(is_sep, group)| (!is_sep).then_some(group)) .map(|tokens| tokens.collect::>()) - .filter(|tokens| !tokens.iter().all(|it| it.kind().is_trivia())) - .map(|tokens| syntax::hacks::parse_expr_from_str(&tokens.iter().join(""), Edition::CURRENT)) + .filter(|tokens| !tokens.is_empty()) + .map(|tokens| { + syntax::hacks::parse_expr_from_str(tokens.iter().join("").trim(), Edition::CURRENT) + }) .collect::>>()?; - let parent = macro_expr.syntax().parent()?; + let parent = macro_expr.syntax().parent(); Some(match &*input_expressions { // dbg!() [] => { + let Some(parent) = parent.clone() else { + return Some((macro_call.syntax().clone().into(), Some(make.expr_unit()))); + }; match_ast! { match parent { - ast::StmtList(_) => { - let mut replace = vec![macro_expr.syntax().clone().into()]; - if let Some(prev_sibling) = macro_expr.syntax().prev_sibling_or_token() - && prev_sibling.kind() == syntax::SyntaxKind::WHITESPACE { - replace.push(prev_sibling); - } - (replace, None) - }, - ast::ExprStmt(it) => { - let mut replace = vec![it.syntax().clone().into()]; - if let Some(prev_sibling) = it.syntax().prev_sibling_or_token() - && prev_sibling.kind() == syntax::SyntaxKind::WHITESPACE { - replace.push(prev_sibling); - } - (replace, None) - }, - _ => (vec![macro_call.syntax().clone().into()], Some(make.expr_unit())), + ast::StmtList(_) => (macro_expr.syntax().clone().into(), None), + ast::ExprStmt(it) => (it.syntax().clone().into(), None), + _ => (macro_call.syntax().clone().into(), Some(make.expr_unit())), } } } // dbg!(2, 'x', &x, x, ...); - exprs if ast::ExprStmt::can_cast(parent.kind()) && exprs.iter().all(pure_expr) => { - let mut replace = vec![parent.clone().into()]; - if let Some(prev_sibling) = parent.prev_sibling_or_token() - && prev_sibling.kind() == syntax::SyntaxKind::WHITESPACE - { - replace.push(prev_sibling); - } - (replace, None) + exprs + if parent.as_ref().is_some_and(|it| ast::ExprStmt::can_cast(it.kind())) + && exprs.iter().all(pure_expr) => + { + (parent.clone()?.into(), None) } // dbg!(expr0) [expr] => { // dbg!(expr, &parent); - let wrap = match ast::Expr::cast(parent) { + let wrap = match parent.clone().and_then(ast::Expr::cast) { Some(parent) => match (expr, parent) { (ast::Expr::CastExpr(_), ast::Expr::CastExpr(_)) => false, ( @@ -168,13 +155,13 @@ fn compute_dbg_replacement( }; let expr = replace_nested_dbgs(expr.clone(), make); let expr = if wrap { make.expr_paren(expr).into() } else { expr }; - (vec![macro_call.syntax().clone().into()], Some(expr)) + (macro_call.syntax().clone().into(), Some(expr)) } // dbg!(expr0, expr1, ...) exprs => { let exprs = exprs.iter().cloned().map(|expr| replace_nested_dbgs(expr, make)); let expr = make.expr_tuple(exprs); - (vec![macro_call.syntax().clone().into()], Some(expr.into())) + (macro_call.syntax().clone().into(), Some(expr.into())) } }) } diff --git a/crates/ide-assists/src/handlers/remove_else_branches.rs b/crates/ide-assists/src/handlers/remove_else_branches.rs index a40d691e4cc3..d3bbbd2e306b 100644 --- a/crates/ide-assists/src/handlers/remove_else_branches.rs +++ b/crates/ide-assists/src/handlers/remove_else_branches.rs @@ -1,4 +1,4 @@ -use syntax::{AstNode, SyntaxKind, T, TextRange, ast}; +use syntax::{AstNode, T, TextRange, ast}; use crate::{AssistContext, AssistId, Assists}; @@ -56,13 +56,22 @@ pub(crate) fn remove_else_branches(acc: &mut Assists, ctx: &AssistContext<'_, '_ target, |builder| { let editor = builder.make_editor(&else_token.parent().unwrap()); - match else_token.prev_token() { - Some(it) if it.kind() == SyntaxKind::WHITESPACE => editor.delete(it), - _ => (), - } - match else_token.next_token() { - Some(it) if it.kind() == SyntaxKind::WHITESPACE => editor.delete(it), - _ => (), + if let Some(prev) = else_token.prev_non_trivia_token() { + editor.strip_trailing_blank_trivia(&prev); + let moved: String = else_branches + .last_non_trivia_token() + .map(|it| it.trailing_trivia().map(|it| it.text().to_owned()).collect()) + .unwrap_or_default(); + if !moved.is_empty() + && let Some(kept) = editor.pending_token(&prev) + { + let start = kept.trailing_trivia().len(); + editor.splice_trailing_trivia( + &prev, + start.., + ast::make::tokens::trivia(&moved), + ); + } } editor.delete(else_token); editor.delete(else_branches); diff --git a/crates/ide-assists/src/handlers/remove_mut.rs b/crates/ide-assists/src/handlers/remove_mut.rs index db379809c5c8..720ff36878d0 100644 --- a/crates/ide-assists/src/handlers/remove_mut.rs +++ b/crates/ide-assists/src/handlers/remove_mut.rs @@ -1,4 +1,4 @@ -use syntax::{SyntaxKind, T}; +use syntax::T; use crate::{AssistContext, AssistId, Assists}; @@ -23,10 +23,6 @@ pub(crate) fn remove_mut(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Opti let target = mut_token.text_range(); acc.add(AssistId::refactor("remove_mut"), "Remove `mut` keyword", target, |builder| { let editor = builder.make_editor(&mut_token.parent().unwrap()); - match mut_token.next_token() { - Some(it) if it.kind() == SyntaxKind::WHITESPACE => editor.delete(it), - _ => (), - } editor.delete(mut_token); builder.add_file_edits(ctx.vfs_file_id(), editor); }) diff --git a/crates/ide-assists/src/handlers/remove_parentheses.rs b/crates/ide-assists/src/handlers/remove_parentheses.rs index d6606d181ebb..1b31cc46035e 100644 --- a/crates/ide-assists/src/handlers/remove_parentheses.rs +++ b/crates/ide-assists/src/handlers/remove_parentheses.rs @@ -1,4 +1,4 @@ -use syntax::{AstNode, SyntaxKind, T, ast, syntax_editor::Position}; +use syntax::{AstNode, SyntaxKind, T, ast, syntax_editor::Element}; use crate::{AssistContext, AssistId, Assists}; @@ -34,7 +34,7 @@ pub(crate) fn remove_parentheses(acc: &mut Assists, ctx: &AssistContext<'_, '_>) return None; } - let target = parens.syntax().text_range(); + let target = parens.syntax().text_range_without_outer_trivia(); acc.add( AssistId::refactor("remove_parentheses"), "Remove redundant parentheses", @@ -42,18 +42,22 @@ pub(crate) fn remove_parentheses(acc: &mut Assists, ctx: &AssistContext<'_, '_>) |builder| { let editor = builder.make_editor(parens.syntax()); let make = editor.make(); - let prev_token = parens.syntax().first_token().and_then(|it| it.prev_token()); + let prev_token = + parens.syntax().first_non_trivia_token().and_then(|it| it.prev_token()); let need_to_add_ws = match prev_token { Some(it) => { let tokens = [T![&], T![!], T!['('], T!['['], T!['{']]; - it.kind() != SyntaxKind::WHITESPACE && !tokens.contains(&it.kind()) + !matches!(it.kind(), SyntaxKind::WHITESPACE | SyntaxKind::NEWLINE) + && !tokens.contains(&it.kind()) } None => false, }; - if need_to_add_ws { - editor.insert(Position::before(parens.syntax()), make.whitespace(" ")); - } - editor.replace(parens.syntax(), expr.syntax()); + let expr = if need_to_add_ws { + make.prepend_leading_trivia(expr.syntax(), " ") + } else { + expr.syntax().syntax_element() + }; + editor.replace(parens.syntax(), expr); builder.add_file_edits(ctx.vfs_file_id(), editor); }, ) diff --git a/crates/ide-assists/src/handlers/remove_underscore.rs b/crates/ide-assists/src/handlers/remove_underscore.rs index 1b65e78378f2..34ae5dea6bda 100644 --- a/crates/ide-assists/src/handlers/remove_underscore.rs +++ b/crates/ide-assists/src/handlers/remove_underscore.rs @@ -36,7 +36,7 @@ pub(crate) fn remove_underscore(acc: &mut Assists, ctx: &AssistContext<'_, '_>) NameClass::PatFieldShorthand { local_def, .. } => Definition::Local(local_def), _ => return None, }; - (text.to_owned(), name_ref.syntax().text_range(), def) + (text.to_owned(), name_ref.syntax().text_range_without_outer_trivia(), def) } else { let name_ref = ctx.find_node_at_offset::()?; let text = name_ref.text(); @@ -48,7 +48,7 @@ pub(crate) fn remove_underscore(acc: &mut Assists, ctx: &AssistContext<'_, '_>) NameRefClass::FieldShorthand { local_ref, .. } => Definition::Local(local_ref), _ => return None, }; - (text.to_owned(), name_ref.syntax().text_range(), def) + (text.to_owned(), name_ref.syntax().text_range_without_outer_trivia(), def) }; if !def.usages(&ctx.sema).at_least_one() { diff --git a/crates/ide-assists/src/handlers/remove_unused_imports.rs b/crates/ide-assists/src/handlers/remove_unused_imports.rs index aeffb8a45b56..16d0ddf1f9d8 100644 --- a/crates/ide-assists/src/handlers/remove_unused_imports.rs +++ b/crates/ide-assists/src/handlers/remove_unused_imports.rs @@ -118,10 +118,12 @@ pub(crate) fn remove_unused_imports(acc: &mut Assists, ctx: &AssistContext<'_, ' acc.add( AssistId::quick_fix("remove_unused_imports"), "Remove all unused imports", - selected_el.text_range(), + selected_el.text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(&selected_el); - unused.sort_by_key(|use_tree| use_tree.syntax().text_range().start()); + unused.sort_by_key(|use_tree| { + use_tree.syntax().text_range_without_outer_trivia().start() + }); for node in &unused { editor.delete(node.syntax()); } @@ -209,8 +211,10 @@ fn module_search_scope(db: &RootDatabase, module: hir::Module) -> Vec None, - ModuleSource::Module(it) => Some(it.syntax().text_range()), - ModuleSource::BlockExpr(it) => Some(it.syntax().text_range()), + ModuleSource::Module(it) => Some(it.syntax().text_range_without_outer_trivia()), + ModuleSource::BlockExpr(it) => { + Some(it.syntax().text_range_without_outer_trivia()) + } }, ) } @@ -238,7 +242,7 @@ fn module_search_scope(db: &RootDatabase, module: hir::Module) -> Vec continue, - ModuleSource::Module(it) => it.syntax().text_range(), + ModuleSource::Module(it) => it.syntax().text_range_without_outer_trivia(), ModuleSource::BlockExpr(_) => continue, }; let mut new_ranges = Vec::new(); @@ -679,9 +683,7 @@ mod m { } } -use m:: - x::B -; +use m::x::B; fn main() { B; diff --git a/crates/ide-assists/src/handlers/remove_unused_param.rs b/crates/ide-assists/src/handlers/remove_unused_param.rs index d7b0b5ea01f2..c21a59f94704 100644 --- a/crates/ide-assists/src/handlers/remove_unused_param.rs +++ b/crates/ide-assists/src/handlers/remove_unused_param.rs @@ -1,13 +1,11 @@ use ide_db::{EditionedFileId, defs::Definition, search::FileReference}; use syntax::{ - AstNode, SourceFile, SyntaxElement, SyntaxKind, SyntaxNode, T, TextRange, + AstNode, Direction, NodeOrToken, SourceFile, SyntaxElement, SyntaxNode, T, TextRange, algo::{find_node_at_range, least_common_ancestor_element}, ast::{self, HasArgList}, syntax_editor::Element, }; -use SyntaxKind::WHITESPACE; - use crate::{ AssistContext, AssistId, Assists, assist_context::SourceChangeBuilder, utils::next_prev, }; @@ -78,7 +76,7 @@ pub(crate) fn remove_unused_param(acc: &mut Assists, ctx: &AssistContext<'_, '_> acc.add( AssistId::refactor("remove_unused_param"), "Remove unused parameter", - param.syntax().text_range(), + param.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(&parent); let elements = elements_to_remove(param.syntax()); @@ -133,7 +131,7 @@ fn process_usage( ) -> Option> { let call_expr_opt: Option = find_node_at_range(source_file.syntax(), range); if let Some(call_expr) = call_expr_opt { - let call_expr_range = call_expr.expr()?.syntax().text_range(); + let call_expr_range = call_expr.expr()?.syntax().text_range_without_outer_trivia(); if !call_expr_range.contains_range(range) { return None; } @@ -145,7 +143,8 @@ fn process_usage( let method_call_expr_opt: Option = find_node_at_range(source_file.syntax(), range); if let Some(method_call_expr) = method_call_expr_opt { - let method_call_expr_range = method_call_expr.name_ref()?.syntax().text_range(); + let method_call_expr_range = + method_call_expr.name_ref()?.syntax().text_range_without_outer_trivia(); if !method_call_expr_range.contains_range(range) { return None; } @@ -168,21 +167,22 @@ pub(crate) fn range_to_remove(node: &SyntaxNode) -> TextRange { .find(|it| it.kind() == T![,]) .map(|it| (dir, it)) }); - if let Some((dir, token)) = up_to_comma { - if node.next_sibling().is_some() { - let up_to_space = token - .siblings_with_tokens(dir) - .skip(1) - .take_while(|it| it.kind() == WHITESPACE) - .last() - .and_then(|it| it.into_token()); - return node - .text_range() - .cover(up_to_space.map_or(token.text_range(), |it| it.text_range())); - } - node.text_range().cover(token.text_range()) - } else { - node.text_range() + let range = node.text_range_without_outer_trivia(); + let Some((dir, token)) = up_to_comma else { return range }; + let range = range.cover(token.text_range()); + if node.next_sibling().is_none() { + return range; + } + match token.siblings_with_tokens(dir).nth(1) { + Some(NodeOrToken::Node(next)) => range.cover_offset(match dir { + Direction::Next => next.text_range_without_outer_trivia().start(), + Direction::Prev => next.text_range_without_outer_trivia().end(), + }), + Some(NodeOrToken::Token(next)) => range.cover_offset(match dir { + Direction::Next => next.text_range().start(), + Direction::Prev => next.text_range().end(), + }), + None => range, } } @@ -195,15 +195,7 @@ pub(crate) fn elements_to_remove(node: &SyntaxNode) -> Vec { }); if let Some((dir, token)) = up_to_comma { let after = token.siblings_with_tokens(dir).nth(1).unwrap(); - let mut result: Vec<_> = - node.siblings_with_tokens(dir).take_while(|it| it != &after).collect(); - if node.next_sibling().is_some() { - result.extend( - token.siblings_with_tokens(dir).skip(1).take_while(|it| it.kind() == WHITESPACE), - ); - } - - result + node.siblings_with_tokens(dir).take_while(|it| it != &after).collect() } else { vec![node.syntax_element()] } @@ -261,7 +253,7 @@ fn b() { foo(1, ) } r#" fn foo() { 0; } fn a() { foo() } -fn b() { foo( ) } +fn b() { foo() } "#, ); } diff --git a/crates/ide-assists/src/handlers/reorder_fields.rs b/crates/ide-assists/src/handlers/reorder_fields.rs index 9c9224b99704..0cb66d3c9211 100644 --- a/crates/ide-assists/src/handlers/reorder_fields.rs +++ b/crates/ide-assists/src/handlers/reorder_fields.rs @@ -3,7 +3,7 @@ use ide_db::FxHashMap; use itertools::Itertools; use syntax::{AstNode, SmolStr, SyntaxElement, ToSmolStr, ast, syntax_editor::SyntaxEditor}; -use crate::{AssistContext, AssistId, Assists}; +use crate::{AssistContext, AssistId, Assists, utils::repositioned}; // Assist: reorder_fields // @@ -90,9 +90,10 @@ fn replace( fields: impl Iterator, sorted_fields: impl IntoIterator, ) { - fields - .zip(sorted_fields) - .for_each(|(field, sorted_field)| editor.replace(field.syntax(), sorted_field.syntax())); + fields.zip(sorted_fields).for_each(|(field, sorted_field)| { + let sorted_field = repositioned(editor.make(), field.syntax(), sorted_field.syntax()); + editor.replace(field.syntax(), sorted_field); + }); } fn compute_fields_ranks( diff --git a/crates/ide-assists/src/handlers/reorder_impl_items.rs b/crates/ide-assists/src/handlers/reorder_impl_items.rs index ed5a372e546d..b892d26f9875 100644 --- a/crates/ide-assists/src/handlers/reorder_impl_items.rs +++ b/crates/ide-assists/src/handlers/reorder_impl_items.rs @@ -6,7 +6,7 @@ use syntax::{ ast::{self, HasName}, }; -use crate::{AssistContext, AssistId, Assists}; +use crate::{AssistContext, AssistId, Assists, utils::repositioned}; // Assist: reorder_impl_items // @@ -53,7 +53,7 @@ pub(crate) fn reorder_impl_items(acc: &mut Assists, ctx: &AssistContext<'_, '_>) // restrict the range // if cursor is in assoc_items, abort - let assoc_range = items.syntax().text_range(); + let assoc_range = items.syntax().text_range_without_outer_trivia(); let cursor_position = ctx.offset(); if assoc_range.contains_inclusive(cursor_position) { cov_mark::hit!(not_applicable_editing_assoc_items); @@ -93,7 +93,7 @@ pub(crate) fn reorder_impl_items(acc: &mut Assists, ctx: &AssistContext<'_, '_>) return None; } - let target = items.syntax().text_range(); + let target = items.syntax().text_range_without_outer_trivia(); acc.add( AssistId::refactor_rewrite("reorder_impl_items"), "Sort items by trait definition", @@ -101,10 +101,10 @@ pub(crate) fn reorder_impl_items(acc: &mut Assists, ctx: &AssistContext<'_, '_>) |builder| { let editor = builder.make_editor(&parent_node); - assoc_items - .into_iter() - .zip(sorted) - .for_each(|(old, new)| editor.replace(old.syntax(), new.syntax())); + assoc_items.into_iter().zip(sorted).for_each(|(old, new)| { + let new = repositioned(editor.make(), old.syntax(), new.syntax()); + editor.replace(old.syntax(), new); + }); builder.add_file_edits(ctx.vfs_file_id(), editor); }, diff --git a/crates/ide-assists/src/handlers/replace_derive_with_manual_impl.rs b/crates/ide-assists/src/handlers/replace_derive_with_manual_impl.rs index 3e98aadb695c..c20d66ca8a2c 100644 --- a/crates/ide-assists/src/handlers/replace_derive_with_manual_impl.rs +++ b/crates/ide-assists/src/handlers/replace_derive_with_manual_impl.rs @@ -4,9 +4,7 @@ use ide_db::{ }; use itertools::Itertools; use syntax::{ - Edition, - SyntaxKind::WHITESPACE, - T, + Edition, T, ast::{self, AstNode, HasName, syntax_factory::SyntaxFactory}, syntax_editor::{Position, SyntaxEditor}, }; @@ -138,7 +136,7 @@ fn add_assist( adt: &ast::Adt, current_edition: Edition, ) -> Option<()> { - let target = attr.syntax().text_range(); + let target = attr.syntax().text_range_without_outer_trivia(); let annotated_name = adt.name()?; let label_trait_path = match replace_trait_mod_path.as_ref() { Some(path) => { @@ -184,7 +182,7 @@ fn add_assist( if let Some(first_assoc_item) = first_assoc_item { if let ast::AssocItem::Fn(ref func) = first_assoc_item && let Some(m) = func.syntax().descendants().find_map(ast::MacroCall::cast) - && m.syntax().text() == "todo!()" + && m.syntax().text_without_outer_trivia() == "todo!()" { // Make the `todo!()` a placeholder editor.add_annotation(m.syntax(), builder.make_placeholder_snippet(cap)); @@ -202,10 +200,7 @@ fn add_assist( } } - editor.insert_all( - insert_after, - vec![make.whitespace("\n\n").into(), impl_def.syntax().clone().into()], - ); + editor.insert(insert_after, make.with_leading_trivia(impl_def.syntax().clone(), "\n\n")); builder.add_file_edits(ctx.vfs_file_id(), editor); }) } @@ -298,7 +293,8 @@ fn update_attribute( .collect::>() }); // ...which are interspersed with ", " - let tt = Itertools::intersperse(tt, vec![make.token(T![,]), make.whitespace(" ")]); + let separator = make.with_trailing_trivia(make.token(T![,]), " ").into_token(); + let tt = Itertools::intersperse(tt, separator.into_iter().collect()); // ...wrap them into the appropriate `NodeOrToken` variant let tt = tt.flatten().map(syntax::NodeOrToken::Token); // ...and make them into a flat list of tokens @@ -307,15 +303,7 @@ fn update_attribute( let new_tree = make.token_tree(T!['('], tt); editor.replace(old_tree.syntax(), new_tree.syntax()); } else { - // Remove the attr and any trailing whitespace - - if let Some(line_break) = - attr.syntax().next_sibling_or_token().filter(|t| t.kind() == WHITESPACE) - { - editor.delete(line_break) - } - - editor.delete(attr.syntax()) + editor.delete_keeping_lines(attr.syntax()) } } diff --git a/crates/ide-assists/src/handlers/replace_if_let_with_match.rs b/crates/ide-assists/src/handlers/replace_if_let_with_match.rs index 50d6f6d62cb3..95725d647729 100644 --- a/crates/ide-assists/src/handlers/replace_if_let_with_match.rs +++ b/crates/ide-assists/src/handlers/replace_if_let_with_match.rs @@ -52,8 +52,8 @@ pub(crate) fn replace_if_let_with_match( ) -> Option<()> { let if_expr: ast::IfExpr = ctx.find_node_at_offset()?; let available_range = TextRange::new( - if_expr.syntax().text_range().start(), - if_expr.then_branch()?.syntax().text_range().start(), + if_expr.syntax().text_range_without_outer_trivia().start(), + if_expr.then_branch()?.syntax().text_range_without_outer_trivia().start(), ); let cursor_in_range = available_range.contains_range(ctx.selection_trimmed()); if !cursor_in_range { @@ -82,7 +82,9 @@ pub(crate) fn replace_if_let_with_match( let (cond, guard) = match let_and_guard(&cond, ctx)? { (None, guard) => (None, Some(guard?)), (Some((pat, expr)), guard) => { - if scrutinee_to_be_expr.syntax().text() != expr.syntax().text() { + if scrutinee_to_be_expr.syntax().text_without_outer_trivia() + != expr.syntax().text_without_outer_trivia() + { // Only if all condition expressions are equal we can merge them into a match return None; } @@ -232,8 +234,8 @@ pub(crate) fn replace_match_with_if_let( let match_expr: ast::MatchExpr = ctx.find_node_at_offset()?; let match_arm_list = match_expr.match_arm_list()?; let available_range = TextRange::new( - match_expr.syntax().text_range().start(), - match_arm_list.syntax().text_range().start(), + match_expr.syntax().text_range_without_outer_trivia().start(), + match_arm_list.syntax().text_range_without_outer_trivia().start(), ); let cursor_in_range = available_range.contains_range(ctx.selection_trimmed()); if !cursor_in_range { @@ -265,7 +267,7 @@ pub(crate) fn replace_match_with_if_let( acc.add( AssistId::refactor_rewrite("replace_match_with_if_let"), format!("Replace match with if{let_}"), - match_expr.syntax().text_range(), + match_expr.syntax().text_range_without_outer_trivia(), move |builder| { let editor = builder.make_editor(match_expr.syntax()); let make = editor.make(); @@ -296,7 +298,7 @@ pub(crate) fn replace_match_with_if_let( ast::Pat::WildcardPat(_) => make.expr_literal("true").into(), _ => make.expr_let(pat, scrutinee.clone()).into(), }; - let condition = if condition.syntax().text() == "true" + let condition = if condition.syntax().text_without_outer_trivia() == "true" && let Some(guard) = guard { guard @@ -422,11 +424,6 @@ fn let_and_guard( if let Some(rhs) = left_bin.rhs() { editor.replace(left_bin.syntax(), rhs.syntax()); } else { - if let Some(next) = left_bin.syntax().next_sibling_or_token() - && next.kind() == SyntaxKind::WHITESPACE - { - editor.delete(next); - } editor.delete(left_bin.syntax()); } @@ -483,8 +480,8 @@ fn parse_matches_macro( let input_guard = if_kwd.as_ref().map(|if_kwd| { input_rest }.skip_while(|it| it != if_kwd).skip(1).join("")); - let pat_token = match { input_pat }.find(|it| !it.kind().is_trivia())? { - syntax::NodeOrToken::Node(node) => node.first_token()?, + let pat_token = match { input_pat }.next()? { + syntax::NodeOrToken::Node(node) => node.first_non_trivia_token()?, syntax::NodeOrToken::Token(t) => t, }; // XXX: Use descend pat for sema analysis diff --git a/crates/ide-assists/src/handlers/replace_is_method_with_if_let_method.rs b/crates/ide-assists/src/handlers/replace_is_method_with_if_let_method.rs index f50614a66fbd..d3ddb456cde6 100644 --- a/crates/ide-assists/src/handlers/replace_is_method_with_if_let_method.rs +++ b/crates/ide-assists/src/handlers/replace_is_method_with_if_let_method.rs @@ -66,7 +66,7 @@ pub(crate) fn replace_is_method_with_if_let_method( acc.add( AssistId::refactor_rewrite(assist_id), message, - call_expr.syntax().text_range(), + call_expr.syntax().text_range_without_outer_trivia(), |edit| { let make = editor.make(); let pat = make.tuple_struct_pat(make.ident_path(text), [pat]).into(); diff --git a/crates/ide-assists/src/handlers/replace_method_eager_lazy.rs b/crates/ide-assists/src/handlers/replace_method_eager_lazy.rs index a414db0a6c8d..f92fc2d39263 100644 --- a/crates/ide-assists/src/handlers/replace_method_eager_lazy.rs +++ b/crates/ide-assists/src/handlers/replace_method_eager_lazy.rs @@ -62,7 +62,7 @@ pub(crate) fn replace_with_lazy_method( acc.add( AssistId::refactor_rewrite("replace_with_lazy_method"), format!("Replace {method_name} with {method_name_lazy}"), - call.syntax().text_range(), + call.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(call.syntax()); let add_param = match &*method_name_lazy { @@ -173,7 +173,7 @@ pub(crate) fn replace_with_eager_method( acc.add( AssistId::refactor_rewrite("replace_with_eager_method"), format!("Replace {method_name} with {method_name_eager}"), - call.syntax().text_range(), + call.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(call.syntax()); let called = into_call(&last_arg, &ctx.sema, editor.make()); diff --git a/crates/ide-assists/src/handlers/replace_named_generic_with_impl.rs b/crates/ide-assists/src/handlers/replace_named_generic_with_impl.rs index 2be8dd1fbda8..7fc4fca0491e 100644 --- a/crates/ide-assists/src/handlers/replace_named_generic_with_impl.rs +++ b/crates/ide-assists/src/handlers/replace_named_generic_with_impl.rs @@ -37,7 +37,7 @@ pub(crate) fn replace_named_generic_with_impl( let type_bound_list = type_param.type_bound_list(); let fn_ = type_param.syntax().ancestors().find_map(ast::Fn::cast)?; - let param_list_text_range = fn_.param_list()?.syntax().text_range(); + let param_list_text_range = fn_.param_list()?.syntax().text_range_without_outer_trivia(); let type_param_hir_def = ctx.sema.to_def(&type_param)?; let type_param_def = Definition::GenericParam(hir::GenericParam::TypeParam(type_param_hir_def)); @@ -64,7 +64,7 @@ pub(crate) fn replace_named_generic_with_impl( } } - let target = type_param.syntax().text_range(); + let target = type_param.syntax().text_range_without_outer_trivia(); acc.add( AssistId::refactor_rewrite("replace_named_generic_with_impl"), @@ -161,7 +161,7 @@ fn find_usages<'db>( type_param_def: Definition<'db>, file_id: EditionedFileId, ) -> UsageSearchResult { - let file_range = FileRange { file_id, range: fn_.syntax().text_range() }; + let file_range = FileRange { file_id, range: fn_.syntax().text_range_without_outer_trivia() }; type_param_def.usages(sema).in_scope(&SearchScope::file_range(file_range)).all() } diff --git a/crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs b/crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs index d7f00bf669cc..613159aa3990 100644 --- a/crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs +++ b/crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs @@ -70,7 +70,7 @@ pub(crate) fn replace_qualified_name_with_use( .flatten(); let scope = ImportScope::find_insert_use_container(original_path.syntax(), &ctx.sema)?; - let target = original_path.syntax().text_range(); + let target = original_path.syntax().text_range_without_outer_trivia(); acc.add( AssistId::refactor_rewrite("replace_qualified_name_with_use"), "Replace qualified path with use", @@ -154,12 +154,12 @@ fn maybe_replace_path(editor: &SyntaxEditor, path: ast::Path, target: ast::Path) } // Shorten `path`, leaving only its last segment. - if let Some(parent) = path.qualifier() { - editor.delete(parent.syntax()); - } if let Some(double_colon) = path.coloncolon_token() { editor.delete(double_colon); } + if let Some(parent) = path.qualifier() { + editor.delete_keeping_leading(parent.syntax()); + } Some(()) } diff --git a/crates/ide-assists/src/handlers/replace_turbofish_with_explicit_type.rs b/crates/ide-assists/src/handlers/replace_turbofish_with_explicit_type.rs index 5e336523b48e..9fbaae06f74d 100644 --- a/crates/ide-assists/src/handlers/replace_turbofish_with_explicit_type.rs +++ b/crates/ide-assists/src/handlers/replace_turbofish_with_explicit_type.rs @@ -62,7 +62,7 @@ pub(crate) fn replace_turbofish_with_explicit_type( } }; - let initializer_start = initializer.syntax().text_range().start(); + let initializer_start = initializer.syntax().text_range_without_outer_trivia().start(); if ctx.offset() > turbofish_range.end() || ctx.offset() < initializer_start { cov_mark::hit!(not_applicable_outside_turbofish); return None; @@ -71,7 +71,7 @@ pub(crate) fn replace_turbofish_with_explicit_type( if let_stmt.colon_token().is_none() { // If there's no colon in a let statement, then there is no explicit type. // let x = fn::<...>(); - let ident_range = let_stmt.pat()?.syntax().text_range(); + let ident_range = let_stmt.pat()?.syntax().text_range_without_outer_trivia(); return acc.add( AssistId::refactor_rewrite("replace_turbofish_with_explicit_type"), @@ -86,7 +86,7 @@ pub(crate) fn replace_turbofish_with_explicit_type( // If there's a type inference underscore, we can offer to replace it with the type in // the turbofish. // let x: _ = fn::<...>(); - let underscore_range = t.syntax().text_range(); + let underscore_range = t.syntax().text_range_without_outer_trivia(); return acc.add( AssistId::refactor_rewrite("replace_turbofish_with_explicit_type"), diff --git a/crates/ide-assists/src/handlers/sort_items.rs b/crates/ide-assists/src/handlers/sort_items.rs index 49b3cfb90828..3e8f9b551db0 100644 --- a/crates/ide-assists/src/handlers/sort_items.rs +++ b/crates/ide-assists/src/handlers/sort_items.rs @@ -7,7 +7,10 @@ use syntax::{ ast::{self, HasName}, }; -use crate::{AssistContext, AssistId, Assists, utils::get_methods}; +use crate::{ + AssistContext, AssistId, Assists, + utils::{get_methods, repositioned}, +}; // Assist: sort_items // @@ -126,15 +129,21 @@ impl AddRewrite for Assists { new: Vec, target: &SyntaxNode, ) -> Option<()> { - self.add(AssistId::refactor_rewrite("sort_items"), label, target.text_range(), |builder| { - let editor = builder.make_editor(target); - - old.into_iter() - .zip(new) - .for_each(|(old, new)| editor.replace(old.syntax(), new.syntax())); - - builder.add_file_edits(builder.file_id, editor) - }) + self.add( + AssistId::refactor_rewrite("sort_items"), + label, + target.text_range_without_outer_trivia(), + |builder| { + let editor = builder.make_editor(target); + + old.into_iter().zip(new).for_each(|(old, new)| { + let new = repositioned(editor.make(), old.syntax(), new.syntax()); + editor.replace(old.syntax(), new); + }); + + builder.add_file_edits(builder.file_id, editor) + }, + ) } } @@ -156,7 +165,9 @@ fn add_sort_methods_assist( let selection = ctx.selection_trimmed(); // ignore assist if the selection intersects with an associated item. - if item_list.assoc_items().any(|item| item.syntax().text_range().intersect(selection).is_some()) + if item_list + .assoc_items() + .any(|item| item.syntax().text_range_without_outer_trivia().intersect(selection).is_some()) { return None; } diff --git a/crates/ide-assists/src/handlers/term_search.rs b/crates/ide-assists/src/handlers/term_search.rs index 5025f60777ba..c475a7dbf133 100644 --- a/crates/ide-assists/src/handlers/term_search.rs +++ b/crates/ide-assists/src/handlers/term_search.rs @@ -13,7 +13,7 @@ use crate::assist_context::{AssistContext, Assists}; pub(crate) fn term_search(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Option<()> { let unexpanded = ctx.find_node_at_offset::()?; let syntax = unexpanded.syntax(); - let goal_range = syntax.text_range(); + let goal_range = syntax.text_range_without_outer_trivia(); let parent = syntax.parent()?; let scope = ctx.sema.scope(&parent)?; diff --git a/crates/ide-assists/src/handlers/toggle_async_sugar.rs b/crates/ide-assists/src/handlers/toggle_async_sugar.rs index 99be89ece164..d157e863e045 100644 --- a/crates/ide-assists/src/handlers/toggle_async_sugar.rs +++ b/crates/ide-assists/src/handlers/toggle_async_sugar.rs @@ -59,12 +59,12 @@ pub(crate) fn sugar_impl_future_into_async( acc.add( AssistId::refactor_rewrite("sugar_impl_future_into_async"), "Convert `impl Future` into async", - function.syntax().text_range(), + function.syntax().text_range_without_outer_trivia(), |builder| { match future_output { // Empty tuple ast::Type::TupleType(t) if t.fields().next().is_none() => { - let mut ret_type_range = ret_type.syntax().text_range(); + let mut ret_type_range = ret_type.syntax().text_range_without_outer_trivia(); // find leftover whitespace let whitespace_range = function @@ -82,15 +82,15 @@ pub(crate) fn sugar_impl_future_into_async( } _ => { builder.replace( - return_impl_trait.syntax().text_range(), - future_output.syntax().text(), + return_impl_trait.syntax().text_range_without_outer_trivia(), + future_output.syntax().text_without_outer_trivia(), ); } } let (place_for_async, async_kw) = match function.visibility() { - Some(vis) => (vis.syntax().text_range().end(), " async"), - None => (function.syntax().text_range().start(), "async "), + Some(vis) => (vis.syntax().text_range_without_outer_trivia().end(), " async"), + None => (function.syntax().text_range_without_outer_trivia().start(), "async "), }; builder.insert(place_for_async, async_kw); }, @@ -141,7 +141,7 @@ pub(crate) fn desugar_async_into_impl_future( acc.add( AssistId::refactor_rewrite("desugar_async_into_impl_future"), "Convert async into `impl Future`", - function.syntax().text_range(), + function.syntax().text_range_without_outer_trivia(), |builder| { let mut async_range = async_token.text_range(); @@ -152,7 +152,7 @@ pub(crate) fn desugar_async_into_impl_future( match return_type { Some(ret_type) => builder.replace( - ret_type.syntax().text_range(), + ret_type.syntax().text_range_without_outer_trivia(), format!("impl {trait_path}"), ), None => builder.insert( @@ -175,11 +175,22 @@ fn unwrap_future_output(path: ast::Path) -> Option { } fn following_whitespace(nt: NodeOrToken<&SyntaxNode, SyntaxToken>) -> Option { - let next_token = match nt { - NodeOrToken::Node(node) => node.next_sibling_or_token(), - NodeOrToken::Token(token) => token.next_sibling_or_token(), - }?; - (next_token.kind() == SyntaxKind::WHITESPACE).then_some(next_token.text_range()) + let (end, next) = match nt { + NodeOrToken::Node(node) => { + (node.text_range_without_outer_trivia().end(), node.last_non_trivia_token()?) + } + NodeOrToken::Token(token) => (token.text_range().end(), token.clone()), + }; + let after = next.next_non_trivia_token()?; + if next + .trailing_trivia() + .chain(after.leading_trivia()) + .any(|it| !matches!(it.kind(), SyntaxKind::WHITESPACE | SyntaxKind::NEWLINE)) + { + return None; + } + let range = TextRange::new(end, after.text_range().start()); + (!range.is_empty()).then_some(range) } #[cfg(test)] diff --git a/crates/ide-assists/src/handlers/toggle_ignore.rs b/crates/ide-assists/src/handlers/toggle_ignore.rs index 35c304b3870c..7bf322015bc0 100644 --- a/crates/ide-assists/src/handlers/toggle_ignore.rs +++ b/crates/ide-assists/src/handlers/toggle_ignore.rs @@ -1,5 +1,7 @@ use syntax::{ - AstNode, AstToken, + AstNode, + SyntaxKind::{COMMENT, NEWLINE}, + TextRange, ast::{self, HasAttrs, edit::AstNodeEdit}, }; @@ -33,32 +35,50 @@ pub(crate) fn toggle_ignore(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> O None => acc.add( AssistId::refactor("toggle_ignore"), "Ignore this test", - attr.syntax().text_range(), + attr.syntax().text_range_without_outer_trivia(), |builder| { - builder.insert(attr.syntax().text_range().end(), format!("\n{indent}#[ignore]")) + let end = attr + .syntax() + .last_non_trivia_token() + .and_then(|it| { + it.trailing_trivia().take_while(|it| it.kind() != NEWLINE).last() + }) + .map_or(attr.syntax().text_range_without_outer_trivia().end(), |it| { + it.text_range().end() + }); + builder.insert(end, format!("\n{indent}#[ignore]")) }, ), Some(ignore_attr) => acc.add( AssistId::refactor("toggle_ignore"), "Re-enable this test", - ignore_attr.syntax().text_range(), + ignore_attr.syntax().text_range_without_outer_trivia(), |builder| { - builder.delete(ignore_attr.syntax().text_range()); - let whitespace = ignore_attr + let range = ignore_attr.syntax().text_range_without_outer_trivia(); + let end = ignore_attr .syntax() - .next_sibling_or_token() - .and_then(|x| x.into_token()) - .and_then(ast::Whitespace::cast); - if let Some(whitespace) = whitespace { - builder.delete(whitespace.syntax().text_range()); - } + .last_non_trivia_token() + .and_then(|last| { + let next = last.next_non_trivia_token()?; + let comment = last + .trailing_trivia() + .chain(next.leading_trivia()) + .find(|it| it.kind() == COMMENT); + Some( + comment.map_or(next.text_range().start(), |it| it.text_range().start()), + ) + }) + .unwrap_or(range.end()); + builder.delete(TextRange::new(range.start(), end)); }, ), } } fn has_ignore_attribute(fn_def: &ast::Fn) -> Option { - fn_def.attrs().find(|attr| attr.path().is_some_and(|it| it.syntax().text() == "ignore")) + fn_def.attrs().find(|attr| { + attr.path().is_some_and(|it| it.syntax().text_without_outer_trivia() == "ignore") + }) } #[cfg(test)] diff --git a/crates/ide-assists/src/handlers/toggle_macro_delimiter.rs b/crates/ide-assists/src/handlers/toggle_macro_delimiter.rs index e1ac9ea13519..a1aeccf03ea4 100644 --- a/crates/ide-assists/src/handlers/toggle_macro_delimiter.rs +++ b/crates/ide-assists/src/handlers/toggle_macro_delimiter.rs @@ -1,9 +1,5 @@ use ide_db::assists::AssistId; -use syntax::{ - AstNode, SyntaxKind, SyntaxToken, T, - algo::{previous_non_trivia_token, skip_trivia_token}, - ast, -}; +use syntax::{AstNode, SyntaxKind, SyntaxToken, T, ast}; use crate::{AssistContext, Assists}; @@ -72,27 +68,34 @@ pub(crate) fn toggle_macro_delimiter(acc: &mut Assists, ctx: &AssistContext<'_, MacroDelims::LBra | MacroDelims::RBra => "Replace delimiters with parentheses", MacroDelims::LCur | MacroDelims::RCur => "Replace delimiters with brackets", }, - token_tree.syntax().text_range(), + token_tree.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(token_tree.syntax()); let make = editor.make(); match token { MacroDelims::LPar | MacroDelims::RPar => { - editor.replace(ltoken, make.token(T!['{'])); - editor.replace(rtoken, make.token(T!['}'])); + editor.replace_token(<oken, &make.token(T!['{'])); + editor.replace_token(&rtoken, &make.token(T!['}'])); if let Some(sc) = semicolon { + let trailing: Vec<_> = + rtoken.trailing_trivia().chain(sc.trailing_trivia()).collect(); + editor.splice_trailing_trivia( + &rtoken, + .., + trailing.iter().map(|it| (it.kind(), it.text())), + ); editor.delete(sc); } } MacroDelims::LBra | MacroDelims::RBra => { - editor.replace(ltoken, make.token(T!['('])); - editor.replace(rtoken, make.token(T![')'])); + editor.replace_token(<oken, &make.token(T!['('])); + editor.replace_token(&rtoken, &make.token(T![')'])); } MacroDelims::LCur | MacroDelims::RCur => { - editor.replace(ltoken, make.token(T!['['])); + editor.replace_token(<oken, &make.token(T!['['])); if semicolon.is_some() || !needs_semicolon(token_tree) { - editor.replace(rtoken, make.token(T![']'])); + editor.replace_token(&rtoken, &make.token(T![']'])); } else { editor.replace_with_many( rtoken, @@ -112,14 +115,13 @@ fn is_macro_call(token_tree: &ast::TokenTree) -> Option { return Some(true); } - let prev = previous_non_trivia_token(token_tree.syntax().clone())?; - let prev_prev = previous_non_trivia_token(prev.clone())?; + let prev = token_tree.syntax().prev_non_trivia_token()?; + let prev_prev = prev.prev_non_trivia_token()?; Some(prev.kind() == T![!] && prev_prev.kind() == SyntaxKind::IDENT) } fn macro_semicolon(token_tree: &ast::TokenTree) -> Option { - let next_token = token_tree.syntax().last_token()?.next_token()?; - skip_trivia_token(next_token, syntax::Direction::Next).filter(|it| it.kind() == T![;]) + token_tree.syntax().next_non_trivia_token().filter(|it| it.kind() == T![;]) } fn needs_semicolon(tt: ast::TokenTree) -> bool { diff --git a/crates/ide-assists/src/handlers/unmerge_imports.rs b/crates/ide-assists/src/handlers/unmerge_imports.rs index ec5c0929b4c3..a1ef4d4c5dbe 100644 --- a/crates/ide-assists/src/handlers/unmerge_imports.rs +++ b/crates/ide-assists/src/handlers/unmerge_imports.rs @@ -1,7 +1,7 @@ use syntax::{ AstNode, SyntaxKind, ast::{self, HasAttrs, HasVisibility, edit::IndentLevel, syntax_factory::SyntaxFactory}, - syntax_editor::{Element, Position, Removable, SyntaxEditor}, + syntax_editor::{Position, Removable, SyntaxEditor}, }; use crate::{ @@ -41,7 +41,7 @@ pub(crate) fn unmerge_imports(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> None => "Unmerge use".into(), }; - let target = tree.syntax().text_range(); + let target = tree.syntax().text_range_without_outer_trivia(); acc.add(AssistId::refactor_rewrite("unmerge_imports"), label, target, |builder| { let make = editor.make(); let new_use = make.use_( @@ -53,13 +53,12 @@ pub(crate) fn unmerge_imports(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> // Remove the use tree from the current use item tree.remove(&editor); // Insert a newline and indentation, followed by the new use item - editor.insert_all( + editor.insert( Position::after(use_.syntax()), - vec![ - make.whitespace(&format!("\n{}", IndentLevel::from_node(use_.syntax()))) - .syntax_element(), - new_use.syntax().syntax_element(), - ], + make.with_leading_trivia( + new_use.syntax(), + &format!("\n{}", IndentLevel::from_node(use_.syntax())), + ), ); builder.add_file_edits(ctx.vfs_file_id(), editor); }) diff --git a/crates/ide-assists/src/handlers/unmerge_match_arm.rs b/crates/ide-assists/src/handlers/unmerge_match_arm.rs index b1ea0c83e77b..7af9c8168b9e 100644 --- a/crates/ide-assists/src/handlers/unmerge_match_arm.rs +++ b/crates/ide-assists/src/handlers/unmerge_match_arm.rs @@ -1,5 +1,5 @@ use syntax::{ - Direction, SyntaxKind, T, + Direction, T, ast::{self, AstNode, edit::IndentLevel}, syntax_editor::{Element, Position}, }; @@ -65,17 +65,11 @@ pub(crate) fn unmerge_match_arm(acc: &mut Assists, ctx: &AssistContext<'_, '_>) make.or_pat(pats_after, or_pat.leading_pipe().is_some()).into() }; let new_match_arm = make.match_arm(new_pat, match_arm.guard(), match_arm_body); - let mut pipe_index = pipe_token.index(); - if pipe_token - .prev_sibling_or_token() - .is_some_and(|it| it.kind() == SyntaxKind::WHITESPACE) - { - pipe_index -= 1; - } + let Some(pipe_index) = pipe_token.index() else { return }; for child in or_pat .syntax() .children_with_tokens() - .skip_while(|child| child.index() < pipe_index) + .skip_while(|child| child.index().is_some_and(|index| index < pipe_index)) { editor.delete(child.syntax_element()); } @@ -96,9 +90,8 @@ pub(crate) fn unmerge_match_arm(acc: &mut Assists, ctx: &AssistContext<'_, '_>) } let indent = IndentLevel::from_node(match_arm.syntax()); - insert_after_old_arm.push(make.whitespace(&format!("\n{indent}")).into()); - - insert_after_old_arm.push(new_match_arm.syntax().clone().into()); + insert_after_old_arm + .push(make.with_leading_trivia(new_match_arm.syntax(), &format!("\n{indent}"))); editor.insert_all(Position::after(match_arm.syntax()), insert_after_old_arm); edit.add_file_edits(ctx.vfs_file_id(), editor); diff --git a/crates/ide-assists/src/handlers/unqualify_method_call.rs b/crates/ide-assists/src/handlers/unqualify_method_call.rs index 242ebc4063d0..0b9668a49a44 100644 --- a/crates/ide-assists/src/handlers/unqualify_method_call.rs +++ b/crates/ide-assists/src/handlers/unqualify_method_call.rs @@ -27,7 +27,8 @@ pub(crate) fn unqualify_method_call(acc: &mut Assists, ctx: &AssistContext<'_, ' let ast::Expr::PathExpr(path_expr) = call.expr()? else { return None }; let path = path_expr.path()?; - let cursor_in_range = path.syntax().text_range().contains_range(ctx.selection_trimmed()); + let cursor_in_range = + path.syntax().text_range_without_outer_trivia().contains_range(ctx.selection_trimmed()); if !cursor_in_range { return None; } @@ -48,7 +49,7 @@ pub(crate) fn unqualify_method_call(acc: &mut Assists, ctx: &AssistContext<'_, ' acc.add( AssistId::refactor_rewrite("unqualify_method_call"), "Unqualify method call", - call.syntax().text_range(), + call.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(call.syntax()); let make = editor.make(); diff --git a/crates/ide-assists/src/handlers/unwrap_branch.rs b/crates/ide-assists/src/handlers/unwrap_branch.rs index bc296b05d485..2c4c5cd6c83d 100644 --- a/crates/ide-assists/src/handlers/unwrap_branch.rs +++ b/crates/ide-assists/src/handlers/unwrap_branch.rs @@ -32,7 +32,7 @@ use crate::{AssistContext, AssistId, Assists}; pub(crate) fn unwrap_branch(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Option<()> { let (editor, _) = SyntaxEditor::new(ctx.source_file().syntax().clone()); let place = unwrap_branch_place(ctx)?; - let target = place.syntax().text_range(); + let target = place.syntax().text_range_without_outer_trivia(); let block = wrap_block_raw(&place, editor.make()); let mut container = place.syntax().clone(); let mut replacement = block.clone(); @@ -83,17 +83,31 @@ pub(crate) fn unwrap_branch(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> O acc.add(AssistId::refactor_rewrite("unwrap_branch"), label, target, |builder| { let replacement = replacement.dedent(from_indent).indent(into_indent); - let mut replacement = extract_statements(replacement); + let (mut replacement, closing_comments) = extract_statements(replacement, editor.make()); let container = prefer_container.unwrap_or(container); + if let Some(next) = + container.last_non_trivia_token().and_then(|it| it.next_non_trivia_token()) + { + editor.prepend_leading_trivia(next, &closing_comments); + } if ast::ExprStmt::can_cast(container.kind()) && block.tail_expr().is_some_and(|it| !it.is_block_like()) { - replacement.push(editor.make().token(T![;]).into()); + let mut semicolon = editor.make().token(T![;]).into(); + if let Some(last) = replacement.pop() { + let trailing: String = last + .last_non_trivia_token() + .map(|it| it.trailing_trivia().map(|it| it.text().to_owned()).collect()) + .unwrap_or_default(); + replacement.push(editor.make().with_trailing_trivia(&last, "")); + semicolon = editor.make().with_trailing_trivia(semicolon, &trailing); + } + replacement.push(semicolon); } + delete_else_before(&container, &editor, &mut replacement); editor.replace_with_many(&container, replacement); - delete_else_before(container, &editor); builder.add_file_edits(ctx.vfs_file_id(), editor); }) @@ -123,7 +137,7 @@ pub(crate) fn unwrap_branch(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> O pub(crate) fn unwrap_block(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Option<()> { let l_curly_token = ctx.find_token_syntax_at_offset(T!['{'])?; let block = l_curly_token.parent_ancestors().nth(1).and_then(ast::BlockExpr::cast)?; - let target = block.syntax().text_range(); + let target = block.syntax().text_range_without_outer_trivia(); let tail_expr = block.tail_expr()?; let stmt_list = block.stmt_list()?; let container = Either::::cast(block.syntax().parent()?)?; @@ -135,12 +149,26 @@ pub(crate) fn unwrap_block(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Op acc.add(AssistId::refactor_rewrite("unwrap_block"), "Unwrap block", target, |builder| { let editor = builder.make_editor(block.syntax()); let replacement = stmt_list.dedent(tail_expr.indent_level()).indent(block.indent_level()); - let mut replacement = extract_statements(replacement); + let (mut replacement, closing_comments) = extract_statements(replacement, editor.make()); + if let Some(next) = + block.syntax().last_non_trivia_token().and_then(|it| it.next_non_trivia_token()) + { + editor.prepend_leading_trivia(next, &closing_comments); + } if container.left().is_some_and(|it| it.comma_token().is_none()) && !tail_expr.is_block_like() { - replacement.push(editor.make().token(T![,]).into()); + let mut comma = editor.make().token(T![,]).into(); + if let Some(last) = replacement.pop() { + let trailing: String = last + .last_non_trivia_token() + .map(|it| it.trailing_trivia().map(|it| it.text().to_owned()).collect()) + .unwrap_or_default(); + replacement.push(editor.make().with_trailing_trivia(&last, "")); + comma = editor.make().with_trailing_trivia(comma, &trailing); + } + replacement.push(comma); } editor.replace_with_many(block.syntax(), replacement); @@ -148,8 +176,11 @@ pub(crate) fn unwrap_block(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Op }) } -fn delete_else_before(container: SyntaxNode, editor: &SyntaxEditor) { - let make = editor.make(); +fn delete_else_before( + container: &SyntaxNode, + editor: &SyntaxEditor, + replacement: &mut [SyntaxElement], +) { let Some(else_token) = container .siblings_with_tokens(syntax::Direction::Prev) .skip(1) @@ -158,12 +189,14 @@ fn delete_else_before(container: SyntaxNode, editor: &SyntaxEditor) { else { return; }; - itertools::chain(else_token.prev_token(), else_token.next_token()) - .filter(|it| it.kind() == SyntaxKind::WHITESPACE) - .for_each(|it| editor.delete(it)); - let indent = IndentLevel::from_node(&container); - let newline = make.whitespace(&format!("\n{indent}")); - editor.replace(else_token, newline); + let indent = IndentLevel::from_node(container).to_string(); + if let Some(prev) = else_token.prev_non_trivia_token() { + editor.splice_trailing_trivia(&prev, .., [(SyntaxKind::NEWLINE, "\n")]); + } + if let Some(first) = replacement.first() { + replacement[0] = editor.make().with_leading_trivia(first, &indent); + } + editor.delete(else_token); } fn wrap_let(assign: &ast::LetStmt, replacement: ast::BlockExpr) -> ast::BlockExpr { @@ -171,7 +204,7 @@ fn wrap_let(assign: &ast::LetStmt, replacement: ast::BlockExpr) -> ast::BlockExp let initializer = assign.initializer()?.syntax().syntax_element(); let (editor, replacement) = SyntaxEditor::with_ast_node(&replacement); let tail_expr = replacement.tail_expr()?; - let before = + let mut before: Vec = assign.syntax().children_with_tokens().take_while(|it| *it != initializer).collect(); let after = assign .syntax() @@ -180,6 +213,17 @@ fn wrap_let(assign: &ast::LetStmt, replacement: ast::BlockExpr) -> ast::BlockExp .skip(1) .collect(); + let mut tail_leading = String::new(); + if let Some(token) = tail_expr.syntax().first_non_trivia_token() { + tail_leading = token.leading_trivia().map(|it| it.text().to_owned()).collect(); + editor.splice_leading_trivia(&token, .., []); + } + if let Some(token) = tail_expr.syntax().last_non_trivia_token() { + editor.splice_trailing_trivia(&token, .., []); + } + if let Some(first) = before.first() { + before[0] = editor.make().with_leading_trivia(first, &tail_leading); + } editor.insert_all(Position::before(tail_expr.syntax()), before); editor.insert_all(Position::after(tail_expr.syntax()), after); ast::BlockExpr::cast(editor.finish().new_root().clone()) @@ -199,15 +243,66 @@ fn unwrap_branch_place(ctx: &AssistContext<'_, '_>) -> Option { } } -fn extract_statements(stmt_list: ast::StmtList) -> Vec { +fn extract_statements( + stmt_list: ast::StmtList, + make: &SyntaxFactory, +) -> (Vec, String) { let mut elements = stmt_list .syntax() .children_with_tokens() .filter(|it| !matches!(it.kind(), T!['{'] | T!['}'])) - .skip_while(|it| it.kind() == SyntaxKind::WHITESPACE) .collect::>(); - while elements.pop_if(|it| it.kind() == SyntaxKind::WHITESPACE).is_some() {} - elements + let indent: String = elements + .first() + .and_then(|it| it.first_non_trivia_token()) + .map(|it| { + it.leading_trivia() + .take_while(|it| it.kind() == SyntaxKind::WHITESPACE) + .map(|it| it.text().to_owned()) + .collect() + }) + .unwrap_or_default(); + if let Some(first) = elements.first() { + let leading: String = stmt_list + .l_curly_token() + .map(|it| { + it.trivia_after() + .filter(|trivia_token| trivia_token.kind() == SyntaxKind::COMMENT) + .map(|trivia_token| match trivia_token.text().starts_with("//") { + true => format!("{}\n{indent}", trivia_token.text()), + false => format!("{} ", trivia_token.text()), + }) + .collect() + }) + .unwrap_or_default(); + elements[0] = make.with_leading_trivia(first, &leading); + } + if let Some(last) = elements.last() { + let index = elements.len() - 1; + let mut trailing: String = last + .last_non_trivia_token() + .map(|it| { + let trivia: Vec<_> = it.trailing_trivia().collect(); + let end = trivia + .iter() + .rposition(|it| it.kind() == SyntaxKind::COMMENT) + .map_or(0, |index| index + 1); + trivia[..end].iter().map(|it| it.text().to_owned()).collect() + }) + .unwrap_or_default(); + if !trailing.is_empty() { + trailing.push('\n'); + } + elements[index] = make.with_trailing_trivia(last, &trailing); + } + let closing_comments = stmt_list + .r_curly_token() + .into_iter() + .flat_map(|it| it.leading_trivia()) + .filter(|it| it.kind() == SyntaxKind::COMMENT) + .map(|it| format!("{indent}{}\n", it.text())) + .collect(); + (elements, closing_comments) } fn wrap_block_raw(expr: &ast::Expr, make: &SyntaxFactory) -> ast::BlockExpr { diff --git a/crates/ide-assists/src/handlers/unwrap_return_type.rs b/crates/ide-assists/src/handlers/unwrap_return_type.rs index e53b73bad664..cc11dd177a7c 100644 --- a/crates/ide-assists/src/handlers/unwrap_return_type.rs +++ b/crates/ide-assists/src/handlers/unwrap_return_type.rs @@ -4,7 +4,7 @@ use ide_db::{ syntax_helpers::node_ext::{for_each_tail_expr, walk_expr}, }; use syntax::{ - AstNode, NodeOrToken, SyntaxKind, + AstNode, ast::{self, HasArgList, HasGenericArgs}, match_ast, }; @@ -65,7 +65,8 @@ pub(crate) fn unwrap_return_type(acc: &mut Assists, ctx: &AssistContext<'_, '_>) let happy_type = extract_wrapped_type(type_ref)?; - acc.add(kind.assist_id(), kind.label(), type_ref.syntax().text_range(), |builder| { + let target = type_ref.syntax().text_range_without_outer_trivia(); + acc.add(kind.assist_id(), kind.label(), target, |builder| { let editor = builder.make_editor(&parent); let make = editor.make(); @@ -82,12 +83,6 @@ pub(crate) fn unwrap_return_type(acc: &mut Assists, ctx: &AssistContext<'_, '_>) let is_unit_type = is_unit_type(&happy_type); if is_unit_type { - if let Some(NodeOrToken::Token(token)) = ret_type.syntax().next_sibling_or_token() - && token.kind() == SyntaxKind::WHITESPACE - { - editor.delete(token); - } - editor.delete(ret_type.syntax()); } else { editor.replace(type_ref.syntax(), happy_type.syntax()); @@ -118,12 +113,12 @@ pub(crate) fn unwrap_return_type(acc: &mut Assists, ctx: &AssistContext<'_, '_>) ); match tail_parent { Some(Either::Left(_expr)) => { - if let Some(ws) = tail_expr + if let Some(prev) = tail_expr .syntax() - .prev_sibling_or_token() - .filter(|e| e.kind() == SyntaxKind::WHITESPACE) + .first_non_trivia_token() + .and_then(|it| it.prev_non_trivia_token()) { - editor.delete(ws); + editor.splice_trailing_trivia(&prev, .., []); } editor.delete(tail_expr.syntax()); } diff --git a/crates/ide-assists/src/handlers/unwrap_tuple.rs b/crates/ide-assists/src/handlers/unwrap_tuple.rs index 7d0205afe359..21b9116a46df 100644 --- a/crates/ide-assists/src/handlers/unwrap_tuple.rs +++ b/crates/ide-assists/src/handlers/unwrap_tuple.rs @@ -80,7 +80,10 @@ pub(crate) fn unwrap_tuple(acc: &mut Assists, ctx: &AssistContext<'_, '_>) -> Op } let s = decls.trim(); - edit.replace(parent.text_range(), s.strip_prefix(prefix).unwrap_or(s)); + edit.replace( + parent.text_range_without_outer_trivia(), + s.strip_prefix(prefix).unwrap_or(s), + ); }, ) } diff --git a/crates/ide-assists/src/handlers/unwrap_type_to_generic_arg.rs b/crates/ide-assists/src/handlers/unwrap_type_to_generic_arg.rs index 0c8e40bca1de..38ea87166cb5 100644 --- a/crates/ide-assists/src/handlers/unwrap_type_to_generic_arg.rs +++ b/crates/ide-assists/src/handlers/unwrap_type_to_generic_arg.rs @@ -47,7 +47,7 @@ pub(crate) fn unwrap_type_to_generic_arg( acc.add( AssistId::refactor_extract("unwrap_type_to_generic_arg"), format!("Unwrap type to type argument {generic_arg}"), - path_type.syntax().text_range(), + path_type.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(path_type.syntax()); editor.replace(path_type.syntax(), generic_arg.syntax()); diff --git a/crates/ide-assists/src/handlers/wrap_return_type.rs b/crates/ide-assists/src/handlers/wrap_return_type.rs index 032cc28858c2..e0a7a981a604 100644 --- a/crates/ide-assists/src/handlers/wrap_return_type.rs +++ b/crates/ide-assists/src/handlers/wrap_return_type.rs @@ -75,7 +75,7 @@ pub(crate) fn wrap_return_type(acc: &mut Assists, ctx: &AssistContext<'_, '_>) - &GroupLabel("Wrap return type in...".into()), kind.assist_id(), kind.label(), - type_ref.syntax().text_range(), + type_ref.syntax().text_range_without_outer_trivia(), |builder| { let editor = builder.make_editor(&parent); let make = editor.make(); @@ -142,7 +142,8 @@ pub(crate) fn wrap_return_type(acc: &mut Assists, ctx: &AssistContext<'_, '_>) - .unwrap(); let error_type_arg = args.generic_args().find(|arg| match arg { ast::GenericArg::TypeArg(_) => { - arg.syntax().text() != type_ref.syntax().text() + arg.syntax().text_without_outer_trivia() + != type_ref.syntax().text_without_outer_trivia() } ast::GenericArg::LifetimeArg(_) => false, _ => true, diff --git a/crates/ide-assists/src/handlers/wrap_unwrap_cfg_attr.rs b/crates/ide-assists/src/handlers/wrap_unwrap_cfg_attr.rs index 94bd29049d0f..dc30eba9e40a 100644 --- a/crates/ide-assists/src/handlers/wrap_unwrap_cfg_attr.rs +++ b/crates/ide-assists/src/handlers/wrap_unwrap_cfg_attr.rs @@ -1,6 +1,6 @@ use ide_db::source_change::SourceChangeBuilder; use syntax::{ - NodeOrToken, SyntaxToken, T, TextRange, algo, + NodeOrToken, SyntaxToken, T, TextRange, ast::{self, AstNode, edit::AstNodeEdit}, }; @@ -44,14 +44,8 @@ fn attempt_get_derive(attr: ast::Attr, ident: SyntaxToken) -> WrapUnwrapOption { // We need to grab all previous tokens until we find a `,` or `(` and all following tokens until we find a `,` or `)` // We also want to consume the following comma if it exists - let mut prev = algo::skip_trivia_token( - ident.prev_sibling_or_token()?.into_token()?, - syntax::Direction::Prev, - )?; - let mut following = algo::skip_trivia_token( - ident.next_sibling_or_token()?.into_token()?, - syntax::Direction::Next, - )?; + let mut prev = ident.prev_sibling_or_token()?.into_token()?; + let mut following = ident.next_sibling_or_token()?.into_token()?; if (prev.kind() == T![,] || prev.kind() == T!['(']) && (following.kind() == T![,] || following.kind() == T![')']) { @@ -66,33 +60,29 @@ fn attempt_get_derive(attr: ast::Attr, ident: SyntaxToken) -> WrapUnwrapOption { } else { let mut consumed_comma = false; // Collect the path - while let Some(prev_token) = algo::skip_trivia_token(prev, syntax::Direction::Prev) - { - let kind = prev_token.kind(); + loop { + let kind = prev.kind(); if kind == T![,] { consumed_comma = true; - derive = derive.cover(prev_token.text_range()); + derive = derive.cover(prev.text_range()); break; } else if kind == T!['('] { break; } else { - derive = derive.cover(prev_token.text_range()); + derive = derive.cover(prev.text_range()); } - prev = prev_token.prev_sibling_or_token()?.into_token()?; + prev = prev.prev_sibling_or_token()?.into_token()?; } - while let Some(next_token) = - algo::skip_trivia_token(following.clone(), syntax::Direction::Next) - { - let kind = next_token.kind(); - match kind { + loop { + match following.kind() { T![,] if !consumed_comma => { - derive = derive.cover(next_token.text_range()); + derive = derive.cover(following.text_range()); break; } T![')'] | T![,] => break, - _ => derive = derive.cover(next_token.text_range()), + _ => derive = derive.cover(following.text_range()), } - following = next_token.next_sibling_or_token()?.into_token()?; + following = following.next_sibling_or_token()?.into_token()?; } Some(WrapUnwrapOption::WrapDerive { derive, attr: attr.clone() }) } @@ -165,7 +155,7 @@ fn wrap_derive( attr: ast::Attr, derive_element: TextRange, ) -> Option<()> { - let range = attr.syntax().text_range(); + let range = attr.syntax().text_range_without_outer_trivia(); let ast::Meta::TokenTreeMeta(meta) = attr.meta()? else { return None }; let token_tree = meta.token_tree()?; let mut path_text = String::new(); @@ -208,8 +198,7 @@ fn wrap_derive( editor.replace_with_many( attr.syntax(), vec![ - new_derive.syntax().clone().into(), - make.whitespace("\n").into(), + make.with_trailing_trivia(new_derive.syntax(), "\n"), cfg_attr.syntax().clone().into(), ], ); @@ -238,7 +227,10 @@ fn wrap_cfg_attrs( attrs: Vec, ) -> Option<()> { let (first_attr, last_attr) = (attrs.first()?, attrs.last()?); - let range = first_attr.syntax().text_range().cover(last_attr.syntax().text_range()); + let range = first_attr + .syntax() + .text_range_without_outer_trivia() + .cover(last_attr.syntax().text_range_without_outer_trivia()); let handle_source_change = |edit: &mut SourceChangeBuilder| { let editor = edit.make_editor(first_attr.syntax()); let make = editor.make(); @@ -276,7 +268,7 @@ fn unwrap_cfg_attr( meta: ast::CfgAttrMeta, ) -> Option<()> { let top_attr = ast::Meta::from(meta.clone()).parent_attr()?; - let range = top_attr.syntax().text_range(); + let range = top_attr.syntax().text_range_without_outer_trivia(); let inner_metas: Vec = meta.metas().collect(); if inner_metas.is_empty() { return None; @@ -292,11 +284,12 @@ fn unwrap_cfg_attr( let make = editor.make(); let mut elements = vec![]; for (i, meta) in inner_metas.into_iter().enumerate() { + let attr = if is_inner { make.attr_inner(meta) } else { make.attr_outer(meta) }; if i > 0 { - elements.push(make.whitespace(&format!("\n{indent}")).into()); + elements.push(make.with_leading_trivia(attr.syntax(), &format!("\n{indent}"))); + } else { + elements.push(attr.syntax().clone().into()); } - let attr = if is_inner { make.attr_inner(meta) } else { make.attr_outer(meta) }; - elements.push(attr.syntax().clone().into()); } editor.replace_with_many(top_attr.syntax(), elements); builder.add_file_edits(ctx.vfs_file_id(), editor); @@ -478,7 +471,7 @@ mod tests { } "#, r#" - #[derive( Clone, Copy)] + #[derive(Clone, Copy)] #[cfg_attr(${0:cfg}, derive(Debug))] pub struct Test { test: u32, @@ -494,7 +487,7 @@ mod tests { } "#, r#" - #[derive(Clone, Copy)] + #[derive(Clone, Copy)] #[cfg_attr(${0:cfg}, derive(Debug))] pub struct Test { test: u32, @@ -513,7 +506,7 @@ mod tests { } "#, r#" - #[derive( Clone, Copy)] + #[derive(Clone, Copy)] #[cfg_attr(${0:cfg}, derive(std::fmt::Debug))] pub struct Test { test: u32, diff --git a/crates/ide-assists/src/tests.rs b/crates/ide-assists/src/tests.rs index 220b0c39fa7a..4adf07a2c3d2 100644 --- a/crates/ide-assists/src/tests.rs +++ b/crates/ide-assists/src/tests.rs @@ -838,20 +838,8 @@ pub fn test_some_range(a: int) -> bool { TextEdit { indels: [ Indel { - insert: "let", - delete: 45..47, - }, - Indel { - insert: "var_name", - delete: 48..60, - }, - Indel { - insert: "=", - delete: 61..81, - }, - Indel { - insert: "5;\n if let 2..6 = var_name {\n true\n } else {\n false\n }", - delete: 82..108, + insert: " let var_name = 5;\n if let 2..6 = var_name {\n true\n } else {\n false\n }\n", + delete: 41..109, }, ], annotation: None, @@ -979,20 +967,8 @@ pub fn test_some_range(a: int) -> bool { TextEdit { indels: [ Indel { - insert: "let", - delete: 45..47, - }, - Indel { - insert: "var_name", - delete: 48..60, - }, - Indel { - insert: "=", - delete: 61..81, - }, - Indel { - insert: "5;\n if let 2..6 = var_name {\n true\n } else {\n false\n }", - delete: 82..108, + insert: " let var_name = 5;\n if let 2..6 = var_name {\n true\n } else {\n false\n }\n", + delete: 41..109, }, ], annotation: None, @@ -1046,24 +1022,8 @@ pub fn test_some_range(a: int) -> bool { TextEdit { indels: [ Indel { - insert: "const", - delete: 45..47, - }, - Indel { - insert: "VAR_NAME:", - delete: 48..60, - }, - Indel { - insert: "i32", - delete: 61..81, - }, - Indel { - insert: "=", - delete: 82..86, - }, - Indel { - insert: "5;\n if let 2..6 = VAR_NAME {\n true\n } else {\n false\n }", - delete: 87..108, + insert: " const VAR_NAME: i32 = 5;\n if let 2..6 = VAR_NAME {\n true\n } else {\n false\n }\n", + delete: 41..109, }, ], annotation: None, @@ -1117,24 +1077,8 @@ pub fn test_some_range(a: int) -> bool { TextEdit { indels: [ Indel { - insert: "static", - delete: 45..47, - }, - Indel { - insert: "VAR_NAME:", - delete: 48..60, - }, - Indel { - insert: "i32", - delete: 61..81, - }, - Indel { - insert: "=", - delete: 82..86, - }, - Indel { - insert: "5;\n if let 2..6 = VAR_NAME {\n true\n } else {\n false\n }", - delete: 87..108, + insert: " static VAR_NAME: i32 = 5;\n if let 2..6 = VAR_NAME {\n true\n } else {\n false\n }\n", + delete: 41..109, }, ], annotation: None, @@ -1188,12 +1132,12 @@ pub fn test_some_range(a: int) -> bool { TextEdit { indels: [ Indel { - insert: "fun_name()", - delete: 59..60, + insert: "fun_name() ", + delete: 59..61, }, Indel { - insert: "\n\nfn fun_name() -> i32 {\n 5\n}", - delete: 110..110, + insert: "}\n\nfn fun_name() -> i32 {\n 5\n}\n", + delete: 109..111, }, ], annotation: None, diff --git a/crates/ide-assists/src/utils.rs b/crates/ide-assists/src/utils.rs index 8acb887133e0..f6ca8f98c9e7 100644 --- a/crates/ide-assists/src/utils.rs +++ b/crates/ide-assists/src/utils.rs @@ -17,17 +17,17 @@ use ide_db::{ }; use itertools::Itertools; use syntax::{ - AstNode, AstToken, Direction, NodeOrToken, SourceFile, + AstNode, Direction, NodeOrToken, SourceFile, SyntaxElement, SyntaxKind::*, SyntaxNode, SyntaxToken, T, TextRange, TextSize, WalkEvent, ast::{ - self, HasArgList, HasAttrs, HasGenericParams, HasName, HasTypeBounds, Whitespace, + self, HasArgList, HasAttrs, HasGenericParams, HasName, HasTypeBounds, edit::{AstNodeEdit, AttrsOwnerEdit, IndentLevel}, make, prec::ExprPrecedence, syntax_factory::SyntaxFactory, }, - syntax_editor::{Element, Removable, SyntaxEditor}, + syntax_editor::{Element, Position, Removable, SyntaxEditor}, }; use crate::{ @@ -40,7 +40,7 @@ pub(crate) mod ref_field_expr; pub(crate) fn unwrap_trivial_block(block_expr: ast::BlockExpr) -> ast::Expr { extract_trivial_expression(&block_expr) - .filter(|expr| !expr.syntax().text().contains_char('\n')) + .filter(|expr| !expr.syntax().text_without_outer_trivia().contains_char('\n')) .unwrap_or_else(|| block_expr.into()) } @@ -52,12 +52,20 @@ pub fn extract_trivial_expression(block_expr: &ast::BlockExpr) -> Option bool { let mut non_trivial_children = stmt_list.syntax().children_with_tokens().filter(|it| match it.kind() { - WHITESPACE | T!['{'] | T!['}'] => false, + T!['{'] | T!['}'] => false, _ => it.as_node() != Some(thing), }); non_trivial_children.next().is_some() }; - if stmt_list.syntax().children_with_tokens().any(|it| ast::AnyComment::can_cast(it.kind())) { + let owns_comment = |token: SyntaxToken| { + token.leading_trivia().chain(token.trailing_trivia()).any(|it| it.kind() == COMMENT) + }; + if stmt_list + .syntax() + .descendants_with_tokens() + .filter_map(|it| it.into_token()) + .any(owns_comment) + { return None; } @@ -83,7 +91,7 @@ pub fn extract_trivial_expression(block_expr: &ast::BlockExpr) -> Option ast::BlockExpr { if let ast::Expr::BlockExpr(block) = expr - && let Some(first) = block.syntax().first_token() + && let Some(first) = block.syntax().first_non_trivia_token() && first.kind() == T!['{'] { block.reset_indent() @@ -135,7 +143,7 @@ fn needs_parens_in_guard_chain(make: &SyntaxFactory, guard: &ast::Expr) -> bool pub fn test_related_attribute_syn(fn_def: &ast::Fn) -> Option { fn_def.attrs().find_map(|attr| { let path = attr.path()?; - let text = path.syntax().text().to_string(); + let text = path.syntax().text_without_outer_trivia().to_string(); if text.starts_with("test") || text.ends_with("test") { Some(attr) } else { None } }) } @@ -289,9 +297,9 @@ pub fn add_trait_assoc_items_to_impl( pub(crate) fn vis_offset(node: &SyntaxNode) -> TextSize { node.children_with_tokens() - .find(|it| !matches!(it.kind(), WHITESPACE | COMMENT | DOC_COMMENT | ATTR)) - .map(|it| it.text_range().start()) - .unwrap_or_else(|| node.text_range().start()) + .find(|it| !matches!(it.kind(), DOC_COMMENT | ATTR)) + .map(|it| it.text_range_without_outer_trivia().start()) + .unwrap_or_else(|| node.text_range_without_outer_trivia().start()) } pub(crate) fn invert_boolean_expression(make: &SyntaxFactory, expr: ast::Expr) -> ast::Expr { @@ -373,9 +381,11 @@ pub(crate) fn insert_attributes( } let elem = before.syntax_element(); let indent = IndentLevel::from_element(&elem); - let whitespace = format!("\n{indent}"); let elements: Vec = attrs - .flat_map(|attr| [attr.syntax().clone().into(), make.whitespace(&whitespace).into()]) + .map(|attr| { + let attr = make.with_leading_trivia(attr.syntax(), &indent.to_string()); + make.with_trailing_trivia(&attr, "\n") + }) .collect(); editor.insert_all(syntax::syntax_editor::Position::before(elem), elements); } @@ -385,12 +395,17 @@ pub(crate) fn next_prev() -> impl Iterator { } pub(crate) fn does_pat_match_variant(pat: &ast::Pat, var: &ast::Pat) -> bool { - let first_node_text = |pat: &ast::Pat| pat.syntax().first_child().map(|node| node.text()); + let first_node_text = |pat: &ast::Pat| { + pat.syntax().first_child().map(|node| node.text_without_outer_trivia().to_string()) + }; let pat_head = match pat { ast::Pat::IdentPat(bind_pat) => match bind_pat.pat() { Some(p) => first_node_text(&p), - None => return pat.syntax().text() == var.syntax().text(), + None => { + return pat.syntax().text_without_outer_trivia() + == var.syntax().text_without_outer_trivia(); + } }, pat => first_node_text(pat), }; @@ -719,7 +734,7 @@ fn generic_param_associated_bounds( let bounds = [make.type_bound(trait_.clone())]; make.where_pred(either::Either::Right(make.ty_path(path).into()), bounds) }) - .unique_by(|it| it.syntax().to_string()) + .unique_by(|it| it.syntax().text_without_outer_trivia().to_string()) .peekable(); trait_where_clause.peek().is_some().then(|| make.where_clause(trait_where_clause)) } @@ -942,14 +957,59 @@ pub(crate) fn get_methods(items: &ast::AssocItemList) -> Vec { .collect() } +pub(crate) fn insert_before_with_separator( + editor: &SyntaxEditor, + anchor: &SyntaxNode, + item: &SyntaxNode, + separator: &str, +) { + let make = editor.make(); + let Some((head, indent)) = separator.rsplit_once('\n') else { + editor.insert(Position::before(anchor), make.with_trailing_trivia(item, separator)); + return; + }; + + let item = make.with_leading_trivia(item, indent); + editor.insert(Position::before(anchor), make.with_trailing_trivia(&item, "\n")); + + let extra = head.matches('\n').count(); + if extra > 0 { + editor.prepend_leading_trivia(anchor, &"\n".repeat(extra)); + } +} + +pub(crate) fn repositioned( + make: &SyntaxFactory, + old: &SyntaxNode, + new: &SyntaxNode, +) -> SyntaxElement { + let blank = |token: &SyntaxToken| matches!(token.kind(), WHITESPACE | NEWLINE); + let text = |it: SyntaxToken| it.text().to_owned(); + + let place: String = old + .first_non_trivia_token() + .map(|it| it.leading_trivia().take_while(blank).map(text).collect()) + .unwrap_or_default(); + let own: String = new + .first_non_trivia_token() + .map(|it| it.leading_trivia().skip_while(blank).map(text).collect()) + .unwrap_or_default(); + let leading = make.with_leading_trivia(new, &format!("{place}{own}")); + + let trailing: String = old + .last_non_trivia_token() + .map(|it| it.trailing_trivia().map(text).collect()) + .unwrap_or_default(); + make.with_trailing_trivia(&leading, &trailing) +} + /// Trim(remove leading and trailing whitespace) `initial_range` in `source_file`, return the trimmed range. pub(crate) fn trimmed_text_range(source_file: &SourceFile, initial_range: TextRange) -> TextRange { let mut trimmed_range = initial_range; while source_file .syntax() .token_at_offset(trimmed_range.start()) - .find_map(Whitespace::cast) - .is_some() + .any(|it| matches!(it.kind(), WHITESPACE | NEWLINE)) && trimmed_range.start() < trimmed_range.end() { let start = trimmed_range.start() + TextSize::from(1); @@ -958,8 +1018,7 @@ pub(crate) fn trimmed_text_range(source_file: &SourceFile, initial_range: TextRa while source_file .syntax() .token_at_offset(trimmed_range.end()) - .find_map(Whitespace::cast) - .is_some() + .any(|it| matches!(it.kind(), WHITESPACE | NEWLINE)) && trimmed_range.start() < trimmed_range.end() { let end = trimmed_range.end() - TextSize::from(1); @@ -1059,11 +1118,14 @@ pub(crate) fn replace_record_field_expr( if let Some(ast::Expr::PathExpr(path_expr)) = record_field.expr() { // replace field shorthand let file_range = ctx.sema.original_range(path_expr.syntax()); - edit.insert(file_range.range.end(), format!(": {}", initializer.syntax().text())) + edit.insert( + file_range.range.end(), + format!(": {}", initializer.syntax().text_without_outer_trivia()), + ) } else if let Some(expr) = record_field.expr() { // just replace expr let file_range = ctx.sema.original_range(expr.syntax()); - edit.replace(file_range.range, initializer.syntax().text()); + edit.replace(file_range.range, initializer.syntax().text_without_outer_trivia()); } } @@ -1114,7 +1176,7 @@ pub(crate) fn tt_from_syntax( } pub(crate) fn cover_let_chain(mut expr: ast::Expr, range: TextRange) -> Option { - if !expr.syntax().text_range().contains_range(range) { + if !expr.syntax().text_range_without_outer_trivia().contains_range(range) { return None; } loop { @@ -1127,7 +1189,7 @@ pub(crate) fn cover_let_chain(mut expr: ast::Expr, range: TextRange) -> Option node, NodeOrToken::Token(t) => t.parent().unwrap(), }; - let mut iter = node.children_with_tokens().filter(|it| range.contains_range(it.text_range())); + let mut iter = node + .children_with_tokens() + .filter(|it| range.contains_range(it.text_range_without_outer_trivia())); let first = iter.next().unwrap_or(node.into()); let last = iter.last().unwrap_or_else(|| first.clone()); first..=last @@ -1154,8 +1218,10 @@ pub(crate) fn is_selected( selection: syntax::TextRange, allow_empty: bool, ) -> bool { - selection.intersect(it.syntax().text_range()).is_some_and(|it| !it.is_empty()) - || allow_empty && it.syntax().text_range().contains_range(selection) + selection + .intersect(it.syntax().text_range_without_outer_trivia()) + .is_some_and(|it| !it.is_empty()) + || allow_empty && it.syntax().text_range_without_outer_trivia().contains_range(selection) } pub fn is_body_const(sema: &Semantics<'_, RootDatabase>, expr: &ast::Expr) -> bool { diff --git a/crates/ide-completion/src/completions/attribute/cfg.rs b/crates/ide-completion/src/completions/attribute/cfg.rs index c314b3f37c04..6d0af731a87a 100644 --- a/crates/ide-completion/src/completions/attribute/cfg.rs +++ b/crates/ide-completion/src/completions/attribute/cfg.rs @@ -2,7 +2,7 @@ use ide_db::SymbolKind; use itertools::Itertools; -use syntax::{AstToken, Direction, NodeOrToken, SmolStr, SyntaxKind, algo, ast::Ident}; +use syntax::{AstToken, SmolStr, SyntaxKind, ast::Ident}; use crate::{CompletionItem, completions::Completions, context::CompletionContext}; @@ -15,22 +15,11 @@ pub(crate) fn complete_cfg(acc: &mut Completions, ctx: &CompletionContext<'_, '_ }; // FIXME: Move this into context/analysis.rs - let previous = ctx - .original_token - .prev_token() - .and_then(|it| { - if matches!(it.kind(), SyntaxKind::EQ) { - Some(it.into()) - } else { - algo::non_trivia_sibling(it.into(), Direction::Prev) - } - }) - .filter(|t| matches!(t.kind(), SyntaxKind::EQ)) - .and_then(|it| algo::non_trivia_sibling(it.prev_sibling_or_token()?, Direction::Prev)) - .map(|it| match it { - NodeOrToken::Node(_) => None, - NodeOrToken::Token(t) => Ident::cast(t), - }); + let equals = match ctx.original_token.kind() { + SyntaxKind::EQ => Some(ctx.original_token.clone()), + _ => ctx.original_token.prev_non_trivia_token().filter(|it| it.kind() == SyntaxKind::EQ), + }; + let previous = equals.and_then(|it| it.prev_non_trivia_token()).map(Ident::cast); match previous { Some(None) => (), Some(Some(p)) => match p.text() { diff --git a/crates/ide-completion/src/completions/flyimport.rs b/crates/ide-completion/src/completions/flyimport.rs index 972cc6d32fef..04ed35876f4c 100644 --- a/crates/ide-completion/src/completions/flyimport.rs +++ b/crates/ide-completion/src/completions/flyimport.rs @@ -418,7 +418,7 @@ fn filter_excluded_flyimport(ctx: &CompletionContext<'_, '_>, import: &LocatedIm fn import_name(ctx: &CompletionContext<'_, '_>) -> String { let token_kind = ctx.token.kind(); - if token_kind.is_any_identifier() { ctx.token.to_string() } else { String::new() } + if token_kind.is_any_identifier() { ctx.token.text().to_owned() } else { String::new() } } fn import_assets_for_path<'db>( diff --git a/crates/ide-completion/src/completions/fn_param.rs b/crates/ide-completion/src/completions/fn_param.rs index f1e8e5f39eaa..a724458ac3a4 100644 --- a/crates/ide-completion/src/completions/fn_param.rs +++ b/crates/ide-completion/src/completions/fn_param.rs @@ -191,7 +191,9 @@ fn should_add_self_completions( return false; } match param_list.params().next() { - Some(first) => first.pat().is_some_and(|pat| pat.syntax().text_range().contains(cursor)), + Some(first) => first + .pat() + .is_some_and(|pat| pat.syntax().text_range_without_outer_trivia().contains(cursor)), None => true, } } @@ -201,12 +203,12 @@ fn comma_wrapper(ctx: &CompletionContext<'_, '_>) -> Option<(impl Fn(&str) -> Sm ctx.original_token.parent_ancestors().find(|node| node.kind() == SyntaxKind::PARAM)?; let next_token_kind = { - let t = param.last_token()?.next_token()?; + let t = param.last_non_trivia_token()?.next_token()?; let t = algo::skip_whitespace_token(t, Direction::Next)?; t.kind() }; let prev_token_kind = { - let t = param.first_token()?.prev_token()?; + let t = param.first_non_trivia_token()?.prev_token()?; let t = algo::skip_whitespace_token(t, Direction::Prev)?; t.kind() }; @@ -219,7 +221,10 @@ fn comma_wrapper(ctx: &CompletionContext<'_, '_>) -> Option<(impl Fn(&str) -> Sm matches!(prev_token_kind, SyntaxKind::COMMA | SyntaxKind::L_PAREN | SyntaxKind::PIPE); let leading = if has_leading_comma { "" } else { ", " }; - Some((move |label: &_| format_smolstr!("{leading}{label}{trailing}"), param.text_range())) + Some(( + move |label: &_| format_smolstr!("{leading}{label}{trailing}"), + param.text_range_without_outer_trivia(), + )) } fn is_simple_param(param: &ast::Param) -> bool { diff --git a/crates/ide-completion/src/completions/item_list/trait_impl.rs b/crates/ide-completion/src/completions/item_list/trait_impl.rs index bf834e8b76b7..b00719e65c7c 100644 --- a/crates/ide-completion/src/completions/item_list/trait_impl.rs +++ b/crates/ide-completion/src/completions/item_list/trait_impl.rs @@ -109,18 +109,13 @@ fn complete_trait_impl_name( // ctx.sema.original_ast_node(item)?; let first_child = real_file_item .children_with_tokens() - .find(|child| { - !matches!( - child.kind(), - SyntaxKind::COMMENT - | SyntaxKind::DOC_COMMENT - | SyntaxKind::WHITESPACE - | SyntaxKind::ATTR - ) - }) + .find(|child| !matches!(child.kind(), SyntaxKind::DOC_COMMENT | SyntaxKind::ATTR)) .unwrap_or_else(|| SyntaxElement::Node(real_file_item.clone())); - TextRange::new(first_child.text_range().start(), ctx.source_range().end()) + TextRange::new( + first_child.text_range_without_outer_trivia().start(), + ctx.source_range().end(), + ) }; complete_trait_impl(acc, ctx, kind, replacement_range, &impl_def); @@ -146,7 +141,7 @@ pub(crate) fn complete_trait_impl_item_by_name( .as_ref() .and_then(|name| ctx.sema.original_syntax_node_rooted(name.syntax())) { - Some(name) => name.text_range(), + Some(name) => name.text_range_without_outer_trivia(), None => ctx.source_range(), }, impl_, @@ -404,7 +399,7 @@ fn add_type_alias_impl( _ => unreachable!(), }; - let start = transformed_ty.syntax().text_range().start(); + let start = transformed_ty.syntax().text_range_without_outer_trivia().start(); let end = if let Some(end) = transformed_ty.colon_token().map(|tok| tok.text_range().start()) @@ -428,7 +423,8 @@ fn add_type_alias_impl( }; let len = end - start; - let mut decl = transformed_ty.syntax().text().slice(..len).to_string(); + let mut decl = + transformed_ty.syntax().text_without_outer_trivia().slice(..len).to_string(); decl.truncate(decl.trim_end().len()); decl.push_str(" = "); @@ -437,9 +433,10 @@ fn add_type_alias_impl( .map(|wc| { let ws = wc .where_token() - .and_then(|it| it.prev_token()) - .filter(|token| token.kind() == SyntaxKind::WHITESPACE) - .map(|token| token.to_string()) + .map(|it| { + it.trivia_before().map(|it| it.text().to_owned()).collect::() + }) + .filter(|it| !it.is_empty()) .unwrap_or_else(|| " ".into()); format!("{ws}{wc}") }) @@ -507,16 +504,15 @@ fn add_const_impl( fn make_const_compl_syntax(const_: &ast::Const) -> SmolStr { let const_ = const_.syntax(); - let start = const_.text_range().start(); - let const_end = const_.text_range().end(); + let full = const_.text_range(); + let start = const_.text_range_without_outer_trivia().start(); let end = const_ .children_with_tokens() .find(|s| s.kind() == T![;] || s.kind() == T![=]) - .map_or(const_end, |f| f.text_range().start()); + .map_or(full.end(), |f| f.text_range_without_outer_trivia().start()); - let len = end - start; - let range = TextRange::new(0.into(), len); + let range = TextRange::new(start - full.start(), end - full.start()); let syntax = const_.text().slice(range).to_smolstr(); @@ -535,16 +531,16 @@ fn function_declaration( node.syntax().clone() }; - let start = node.text_range().start(); - let end = node.text_range().end(); + let full = node.text_range(); + let start = node.text_range_without_outer_trivia().start(); let end = node .last_child_or_token() .filter(|s| s.kind() == T![;] || s.kind() == SyntaxKind::BLOCK_EXPR) - .map_or(end, |f| f.text_range().start()); + .map_or(full.end(), |f| f.text_range_without_outer_trivia().start()); - let len = end - start; - let mut syntax = node.text().slice(..len).to_string(); + let range = TextRange::new(start - full.start(), end - full.start()); + let mut syntax = node.text().slice(range).to_string(); syntax.truncate(syntax.trim_end().len()); syntax @@ -1730,7 +1726,7 @@ trait DesugaredAsyncTrait { } impl DesugaredAsyncTrait for () { - fn foo(&self) -> impl Future { + fn foo(&self) -> impl Future { $0 } } diff --git a/crates/ide-completion/src/completions/postfix.rs b/crates/ide-completion/src/completions/postfix.rs index 34b53e5e5bfe..25df75a60af4 100644 --- a/crates/ide-completion/src/completions/postfix.rs +++ b/crates/ide-completion/src/completions/postfix.rs @@ -13,7 +13,7 @@ use ide_db::{ text_edit::TextEdit, ty_filter::TryEnum, }; -use itertools::{Either, Itertools}; +use itertools::Itertools; use stdx::never; use syntax::{ SmolStr, @@ -458,10 +458,17 @@ fn include_references(initial_element: &ast::Expr) -> (ast::Expr, String) { .syntax() .children_with_tokens() .filter(|it| Some(it) != last_child_or_token.as_ref()) - .flat_map(|it| { - let has_ws = it.next_sibling_or_token().is_some_and(|it| it.kind().is_trivia()); - let need_ws = !has_ws && it.kind().is_any_identifier(); - itertools::chain([Either::Left(it)], need_ws.then_some(Either::Right(" "))) + .map(|it| { + let text = match &it { + syntax::NodeOrToken::Node(node) => { + node.text_without_outer_trivia().to_string() + } + syntax::NodeOrToken::Token(token) => token.text().to_owned(), + }; + match it.kind().is_any_identifier() { + true => format!("{text} "), + false => text, + } }) .format("") .to_smolstr() @@ -555,7 +562,7 @@ pub(crate) fn is_in_condition(it: &ast::Expr) -> bool { ast::MatchGuard(guard) => guard.condition()? == *it, ast::BinExpr(bin_expr) => (bin_expr.op_token()?.kind() == T![&&]) .then(|| is_in_condition(&bin_expr.into()))?, - ast::Expr(expr) => (expr.syntax().text_range().start() == it.syntax().text_range().start()) + ast::Expr(expr) => (expr.syntax().text_range_without_outer_trivia().start() == it.syntax().text_range_without_outer_trivia().start()) .then(|| is_in_condition(&expr))?, _ => return None, } }) diff --git a/crates/ide-completion/src/completions/record.rs b/crates/ide-completion/src/completions/record.rs index 598e6763c7ee..ca45d6e2c8dc 100644 --- a/crates/ide-completion/src/completions/record.rs +++ b/crates/ide-completion/src/completions/record.rs @@ -3,7 +3,6 @@ use hir::{HasContainer, ItemContainer}; use ide_db::SymbolKind; use syntax::{ SmolStr, T, - algo::next_non_trivia_token, ast::{self, Expr}, }; @@ -103,7 +102,7 @@ pub(crate) fn add_default_update( ty.zip(ctx.containing_function).is_some_and(|(ty, f)| ty.original == f.ret_type(ctx.db) && matches!(f.container(ctx.db), ItemContainer::Impl(impl_) if impl_.trait_(ctx.db) == default_trait)); let ends_of_record_list = - next_non_trivia_token(ctx.token.clone()).is_none_or(|it| it.kind() == T!['}']); + ctx.token.next_non_trivia_token().is_none_or(|it| it.kind() == T!['}']); if impls_default_trait && !in_own_default_impl && ends_of_record_list { // FIXME: This should make use of scope_def like completions so we get all the other goodies diff --git a/crates/ide-completion/src/completions/type.rs b/crates/ide-completion/src/completions/type.rs index 391152f438b6..c648188e824c 100644 --- a/crates/ide-completion/src/completions/type.rs +++ b/crates/ide-completion/src/completions/type.rs @@ -166,7 +166,7 @@ pub(crate) fn complete_type_path<'db>( let arg_idx = arg_list .generic_args() .filter(|arg| { - arg.syntax().text_range().end() + arg.syntax().text_range_without_outer_trivia().end() < ctx.original_token.text_range().start() }) .count(); diff --git a/crates/ide-completion/src/completions/use_.rs b/crates/ide-completion/src/completions/use_.rs index 1ff7dd6deff0..3de58f248879 100644 --- a/crates/ide-completion/src/completions/use_.rs +++ b/crates/ide-completion/src/completions/use_.rs @@ -48,7 +48,7 @@ pub(crate) fn complete_use_path( let unknown_is_current = |name: &hir::Name| { matches!( name_ref, - Some(name_ref) if name_ref.syntax().text() == name.as_str() + Some(name_ref) if name_ref.syntax().text_without_outer_trivia() == name.as_str() ) }; for (name, def) in module_scope { diff --git a/crates/ide-completion/src/context.rs b/crates/ide-completion/src/context.rs index 5935e16542e4..d06e8ef2809a 100644 --- a/crates/ide-completion/src/context.rs +++ b/crates/ide-completion/src/context.rs @@ -906,9 +906,7 @@ impl<'a, 'db> CompletionContext<'a, 'db> { ) }) { - let next_token = iter::successors(token.next_token(), |it| it.next_token()) - .map(|it| it.kind()) - .find(|kind| !kind.is_trivia()); + let next_token = token.next_non_trivia_token().map(|it| it.kind()); match term_node.kind() { MATCH_ARM if next_token != Some(T![,]) => CompleteSemicolon::CompleteComma, BLOCK_EXPR if next_token != Some(T![;]) => CompleteSemicolon::CompleteSemi, diff --git a/crates/ide-completion/src/context/analysis.rs b/crates/ide-completion/src/context/analysis.rs index 7280fd1ad575..aefcfb7e0b23 100644 --- a/crates/ide-completion/src/context/analysis.rs +++ b/crates/ide-completion/src/context/analysis.rs @@ -10,10 +10,7 @@ use stdx::always; use syntax::{ AstNode, AstToken, Direction, NodeOrToken, SyntaxElement, SyntaxKind, SyntaxNode, SyntaxToken, T, TextRange, TextSize, - algo::{ - self, ancestors_at_offset, find_node_at_offset, non_trivia_sibling, - previous_non_trivia_token, - }, + algo::{self, ancestors_at_offset, find_node_at_offset}, ast::{ self, AttrKind, HasArgList, HasGenericArgs, HasGenericParams, HasLoopBody, HasName, NameOrNameRef, @@ -382,8 +379,10 @@ fn expand( orig_tt.syntax().parent().and_then(ast::MacroCall::cast)?, spec_tt.syntax().parent().and_then(ast::MacroCall::cast)?, ); - let mac_call_path0 = actual_macro_call.path().as_ref().map(|s| s.syntax().text()); - let mac_call_path1 = macro_call_with_fake_ident.path().as_ref().map(|s| s.syntax().text()); + let mac_call_path0 = + actual_macro_call.path().as_ref().map(|s| s.syntax().text_without_outer_trivia()); + let mac_call_path1 = + macro_call_with_fake_ident.path().as_ref().map(|s| s.syntax().text_without_outer_trivia()); // inconsistent state, stop expanding if mac_call_path0 != mac_call_path1 { @@ -458,7 +457,7 @@ fn analyze<'db>( if original_token.kind() != self_token.kind() // FIXME: This check can be removed once we use speculative database forking for completions - && !(original_token.kind().is_punct() || original_token.kind().is_trivia()) + && !(original_token.kind().is_punct() || original_token.is_trivia()) && !(SyntaxKind::is_any_identifier(original_token.kind()) && SyntaxKind::is_any_identifier(self_token.kind())) { @@ -500,13 +499,17 @@ fn analyze<'db>( } else { // Fix up trailing whitespace problem // #[attr(foo = $0 - let token = syntax::algo::skip_trivia_token(self_token.clone(), Direction::Prev)?; + let token = if !self_token.is_trivia() { + self_token.clone() + } else { + self_token.prev_non_trivia_token()? + }; let p = token.parent()?; if p.kind() == SyntaxKind::TOKEN_TREE && p.ancestors().any(|it| it.kind() == SyntaxKind::TOKEN_TREE_META) { - let colon_prefix = previous_non_trivia_token(self_token.clone()) - .is_some_and(|it| T![:] == it.kind()); + let colon_prefix = + self_token.prev_non_trivia_token().is_some_and(|it| T![:] == it.kind()); CompletionAnalysis::UnexpandedAttrTT { fake_attribute_under_caret: fake_ident_token @@ -518,11 +521,8 @@ fn analyze<'db>( } else if p.kind() == SyntaxKind::TOKEN_TREE && p.ancestors().any(|it| ast::Macro::can_cast(it.kind())) { - if let Some([_ident, colon, _name, dollar]) = fake_ident_token - .siblings_with_tokens(Direction::Prev) - .filter(|it| !it.kind().is_trivia()) - .take(4) - .collect_array() + if let Some([_ident, colon, _name, dollar]) = + fake_ident_token.siblings_with_tokens(Direction::Prev).take(4).collect_array() && dollar.kind() == T![$] && colon.kind() == T![:] { @@ -592,7 +592,7 @@ fn expected_type_and_name<'db>( name_like: &ast::NameLike, ) -> (Option>, Option) { let token = prev_special_biased_token_at_trivia(self_token.clone()); - let mut node = match token.parent() { + let mut node = match token.owning_node() { Some(it) => it, None => return (None, None), }; @@ -729,7 +729,7 @@ fn expected_type_and_name<'db>( } else { cov_mark::hit!(expected_type_struct_field_without_leading_char); cov_mark::hit!(expected_type_struct_field_followed_by_comma); - let expr_field = previous_non_trivia_token(token.clone())?.parent().and_then(ast::RecordExprField::cast)?; + let expr_field = token.prev_non_trivia_token()?.parent().and_then(ast::RecordExprField::cast)?; let (_, _, ty) = sema.resolve_record_field(&expr_field)?; Some(( Some(ty), @@ -753,7 +753,7 @@ fn expected_type_and_name<'db>( // match foo { $0 } // match foo { ..., pat => $0 } ast::MatchExpr(it) => { - let on_arrow = previous_non_trivia_token(token.clone()).is_some_and(|it| T![=>] == it.kind()); + let on_arrow = token.prev_non_trivia_token().is_some_and(|it| T![=>] == it.kind()); let ty = if on_arrow { // match foo { ..., pat => $0 } @@ -768,8 +768,8 @@ fn expected_type_and_name<'db>( (ty, None) }, ast::MatchArm(it) => { - let on_arrow = previous_non_trivia_token(token.clone()).is_some_and(|it| T![=>] == it.kind()); - let in_body = it.expr().is_some_and(|it| it.syntax().text_range().contains_range(token.text_range())); + let on_arrow = token.prev_non_trivia_token().is_some_and(|it| T![=>] == it.kind()); + let in_body = it.expr().is_some_and(|it| it.syntax().text_range_without_outer_trivia().contains_range(token.text_range())); let match_expr = it.parent_match(); let ty = if on_arrow || in_body { @@ -786,7 +786,7 @@ fn expected_type_and_name<'db>( }, ast::IfExpr(it) => { let ty = if let Some(body) = it.then_branch() - && token.text_range().end() > body.syntax().text_range().start() + && token.text_range().end() > body.syntax().text_range_without_outer_trivia().start() { sema.type_of_expr(&body.into()) } else { @@ -806,7 +806,7 @@ fn expected_type_and_name<'db>( }, ast::TupleStructPat(it) => { let fields = sema.resolve_tuple_struct_pat_fields(&it); - let nr = it.fields().take_while(|it| it.syntax().text_range().end() <= token.text_range().start()).count(); + let nr = it.fields().take_while(|it| it.syntax().text_range_without_outer_trivia().end() <= token.text_range().start()).count(); let ty = fields.and_then(|fields| Some(rebase_ty(fields.get(nr)?.1.clone()))); (ty, None) }, @@ -843,7 +843,7 @@ fn expected_type_and_name<'db>( ast::ParamList(it) => { let closure = it.syntax().parent().and_then(ast::ClosureExpr::cast); let ty = closure - .filter(|_| it.syntax().text_range().end() <= self_token.text_range().start()) + .filter(|_| it.syntax().text_range_without_outer_trivia().end() <= self_token.text_range().start()) .and_then(|it| sema.type_of_expr(&it.into())); ty.and_then(|ty| ty.original.as_callable(sema.db)) .map(|c| (Some(c.return_type()), None)) @@ -889,8 +889,10 @@ fn classify_lifetime( return None; } - let lifetime = - find_node_at_offset::(original_file, lifetime.syntax().text_range().start()); + let lifetime = find_node_at_offset::( + original_file, + lifetime.syntax().text_range_without_outer_trivia().start(), + ); let kind = match_ast! { match parent { ast::LifetimeParam(_) => LifetimeKind::LifetimeParam, @@ -943,7 +945,8 @@ fn classify_name( _ => return None, } }; - let name = find_node_at_offset(original_file, name.syntax().text_range().start()); + let name = + find_node_at_offset(original_file, name.syntax().text_range_without_outer_trivia().start()); Some(NameContext { name, kind }) } @@ -959,8 +962,8 @@ fn classify_name_ref<'db>( let make_res = |kind| (NameRefContext { nameref: nameref.clone(), kind }, Default::default()); if let Some(record_field) = ast::RecordExprField::for_field_name(&name_ref) { - let dot_prefix = previous_non_trivia_token(name_ref.syntax().clone()) - .is_some_and(|it| T![.] == it.kind()); + let dot_prefix = + name_ref.syntax().prev_non_trivia_token().is_some_and(|it| T![.] == it.kind()); return find_node_in_file_compensated( sema, @@ -991,15 +994,14 @@ fn classify_name_ref<'db>( let receiver_is_ambiguous_float_literal = match &receiver { Some(ast::Expr::Literal(l)) => { matches!(l.kind(), ast::LiteralKind::FloatNumber { .. }) - && l.syntax().last_token().is_some_and(|it| it.text().ends_with('.')) + && l.syntax().last_non_trivia_token().is_some_and(|it| it.text().ends_with('.')) } _ => false, }; let receiver_is_part_of_indivisible_expression = match &receiver { Some(ast::Expr::IfExpr(_)) => { - let next_token_kind = - next_non_trivia_token(name_ref.syntax().clone()).map(|t| t.kind()); + let next_token_kind = name_ref.syntax().next_non_trivia_token().map(|t| t.kind()); next_token_kind == Some(SyntaxKind::ELSE_KW) } _ => false, @@ -1083,7 +1085,7 @@ fn classify_name_ref<'db>( Some(stmt) => stmt.syntax().clone(), None => node, }; - let prev_sibling = non_trivia_sibling(node.into(), Direction::Prev)?.into_node()?; + let prev_sibling = SyntaxElement::from(node).prev_sibling_or_token()?.into_node()?; match_ast! { match prev_sibling { @@ -1101,10 +1103,10 @@ fn classify_name_ref<'db>( node.parent() .and_then(ast::ExprStmt::cast) .filter(|stmt| stmt.semicolon_token().is_none()) - .and_then(|stmt| non_trivia_sibling(stmt.syntax().clone().into(), Direction::Next)) + .and_then(|stmt| stmt.syntax().next_sibling_or_token()) .and_then(NodeOrToken::into_node) .filter(|next| next.kind() == SyntaxKind::ERROR) - .and_then(|next| next.first_token()) + .and_then(|next| next.first_non_trivia_token()) .is_some_and(|token| token.kind() == SyntaxKind::ELSE_KW) }; @@ -1116,8 +1118,7 @@ fn classify_name_ref<'db>( // The following code checks if the body is missing, if it is we either cut off the body // from the item or it was missing in the first place let inbetween_body_and_decl_check = |node: SyntaxNode| { - if let Some(NodeOrToken::Node(n)) = - syntax::algo::non_trivia_sibling(node.into(), syntax::Direction::Prev) + if let Some(NodeOrToken::Node(n)) = SyntaxElement::from(node).prev_sibling_or_token() && let Some(item) = ast::Item::cast(n) { let is_inbetween = match &item { @@ -1335,9 +1336,7 @@ fn classify_name_ref<'db>( let make_path_kind_expr = |expr: ast::Expr| { let it = expr.syntax(); - let prev_token = iter::successors(it.first_token(), |it| it.prev_token()) - .skip(1) - .find(|it| !it.kind().is_trivia()); + let prev_token = it.first_non_trivia_token().and_then(|it| it.prev_non_trivia_token()); let in_block_expr = is_in_block(it); let (in_loop_body, innermost_breakable) = is_in_breakable(it).unzip(); let after_if_expr = is_after_if_expr(it.clone()); @@ -1512,7 +1511,7 @@ fn classify_name_ref<'db>( let kind = attr.kind(); let attached = attr.syntax().parent()?; let is_trailing_outer_attr = kind != AttrKind::Inner - && non_trivia_sibling(attr.syntax().clone().into(), syntax::Direction::Next).is_none(); + && attr.syntax().next_sibling_or_token().is_none_or(|it| it.kind() == SyntaxKind::EOF); let annotated_item_kind = if is_trailing_outer_attr { None } else { Some(attached.kind()) }; let derive_helpers = annotated_item_kind .filter(|kind| { @@ -1709,8 +1708,7 @@ fn classify_name_ref<'db>( _ => None, }; if let Some(top) = top_node { - if let Some(NodeOrToken::Node(error_node)) = - syntax::algo::non_trivia_sibling(top.clone().into(), syntax::Direction::Prev) + if let Some(NodeOrToken::Node(error_node)) = top.prev_sibling_or_token() && error_node.kind() == SyntaxKind::ERROR { for token in error_node.children_with_tokens().filter_map(NodeOrToken::into_token) { @@ -1727,9 +1725,8 @@ fn classify_name_ref<'db>( if let PathKind::Item { .. } = path_ctx.kind && qualifier_ctx.none() - && let Some(t) = top.first_token() - && let Some(prev) = - t.prev_token().and_then(|t| syntax::algo::skip_trivia_token(t, Direction::Prev)) + && let Some(t) = top.first_non_trivia_token() + && let Some(prev) = t.prev_non_trivia_token() && ![T![;], T!['}'], T!['{'], T![']']].contains(&prev.kind()) { // This was inferred to be an item position path, but it seems @@ -1755,15 +1752,7 @@ fn has_parens(node: &dyn HasArgList) -> bool { if arg_list.l_paren_token().is_none() { return false; } - let prev_siblings = iter::successors(arg_list.syntax().prev_sibling_or_token(), |it| { - it.prev_sibling_or_token() - }); - prev_siblings - .take_while(|syntax| syntax.kind().is_trivia()) - .filter_map(|syntax| { - syntax.into_token().filter(|token| token.kind() == SyntaxKind::WHITESPACE) - }) - .all(|whitespace| !whitespace.text().contains('\n')) + !arg_list.syntax().trivia_before().any(|it| it.kind() == SyntaxKind::NEWLINE) } fn pattern_context_for( @@ -1834,7 +1823,7 @@ fn pattern_context_for( let variant_already_present = match_arm_list.arms().any(|arm| { arm.pat().and_then(|pat| { - let pat_already_present = pat.syntax().to_string().contains(variant_name.as_str()); + let pat_already_present = pat.syntax().text_without_outer_trivia().to_string().contains(variant_name.as_str()); pat_already_present.then_some(pat_already_present) }).is_some() }); @@ -1919,7 +1908,7 @@ fn find_opt_node_in_file(syntax: &SyntaxNode, node: Option) -> Op /// If the fake identifier has been inserted after this node or inside of this node use the `_compensated` version instead. fn find_node_in_file(syntax: &SyntaxNode, node: &N) -> Option { let syntax_range = syntax.text_range(); - let range = node.syntax().text_range(); + let range = node.syntax().text_range_without_outer_trivia(); let intersection = range.intersect(syntax_range)?; syntax.covering_element(intersection).ancestors().find_map(N::cast) } @@ -1978,8 +1967,8 @@ fn path_or_use_tree_qualifier(path: &ast::Path) -> Option<(ast::Path, bool)> { fn left_ancestors(node: Option) -> impl Iterator { node.into_iter().flat_map(|node| { - let end = node.text_range().end(); - node.ancestors().take_while(move |it| it.text_range().end() == end) + let end = node.text_range_without_outer_trivia().end(); + node.ancestors().take_while(move |it| it.text_range_without_outer_trivia().end() == end) }) } @@ -1992,13 +1981,14 @@ fn is_in_token_of_for_loop(path: &ast::Path) -> bool { return Some(false); } let pat = for_expr.pat()?; - let next_sibl = next_non_trivia_sibling(pat.syntax().clone().into())?; + let next_sibl = pat.syntax().next_sibling_or_token()?; Some(match next_sibl { syntax::NodeOrToken::Node(n) => { - n.text_range().start() == path.syntax().text_range().start() + n.text_range_without_outer_trivia().start() + == path.syntax().text_range_without_outer_trivia().start() } syntax::NodeOrToken::Token(t) => { - t.text_range().start() == path.syntax().text_range().start() + t.text_range().start() == path.syntax().text_range_without_outer_trivia().start() } }) })() @@ -2018,7 +2008,7 @@ fn is_in_breakable(node: &SyntaxNode) -> Option<(BreakableKind, SyntaxNode)> { _ => return None, } }; - loop_body.syntax().text_range().contains_range(node.text_range()) + loop_body.syntax().text_range_without_outer_trivia().contains_range(node.text_range()) .then_some((breakable, it)) }) } @@ -2040,12 +2030,13 @@ fn is_in_block(node: &SyntaxNode) -> bool { /// it is considered that the `PathExpr` is not part of the `Expr`. fn has_in_newline_expr_first(node: &SyntaxNode) -> bool { if ast::PathExpr::can_cast(node.kind()) - && let Some(NodeOrToken::Token(next)) = node.next_sibling_or_token() - && next.kind() == SyntaxKind::WHITESPACE - && next.text().contains('\n') + && node.trivia_after().any(|it| it.kind() == SyntaxKind::NEWLINE) && let Some(stmt_like) = node .ancestors() - .take_while(|it| it.text_range().start() == node.text_range().start()) + .take_while(|it| { + it.text_range_without_outer_trivia().start() + == node.text_range_without_outer_trivia().start() + }) .filter_map(Either::::cast) .last() { @@ -2060,44 +2051,18 @@ fn is_after_if_expr(node: SyntaxNode) -> bool { Some(stmt) => stmt.syntax().clone(), None => node, }; - let Some(prev_token) = previous_non_trivia_token(node) else { return false }; + let Some(prev_token) = node.prev_non_trivia_token() else { return false }; prev_token .parent_ancestors() - .take_while(|it| it.text_range().end() == prev_token.text_range().end()) + .take_while(|it| { + it.text_range_without_outer_trivia().end() == prev_token.text_range().end() + }) .find_map(ast::IfExpr::cast) .is_some() } -fn next_non_trivia_token(e: impl Into) -> Option { - let mut token = match e.into() { - SyntaxElement::Node(n) => n.last_token()?, - SyntaxElement::Token(t) => t, - } - .next_token(); - while let Some(inner) = token { - if !inner.kind().is_trivia() { - return Some(inner); - } else { - token = inner.next_token(); - } - } - None -} - -fn next_non_trivia_sibling(ele: SyntaxElement) -> Option { - let mut e = ele; - while let Some(next) = e.next_sibling_or_token() { - if !next.kind().is_trivia() { - return Some(next); - } else { - e = next; - } - } - None -} - fn prev_special_biased_token_at_trivia(mut token: SyntaxToken) -> SyntaxToken { - while token.kind().is_trivia() + while token.is_trivia() && let Some(prev) = token.prev_token() && let T![=] | T![+=] diff --git a/crates/ide-completion/src/render.rs b/crates/ide-completion/src/render.rs index f5c54832a12c..0c69eb6e0990 100644 --- a/crates/ide-completion/src/render.rs +++ b/crates/ide-completion/src/render.rs @@ -322,7 +322,7 @@ pub(crate) fn render_expr<'db>( let source_range = match ctx.original_token.parent() { Some(node) => match node.ancestors().find_map(ast::Path::cast) { - Some(path) => path.syntax().text_range(), + Some(path) => path.syntax().text_range_without_outer_trivia(), None => node.text_range(), }, None => ctx.source_range(), diff --git a/crates/ide-completion/src/render/macro_.rs b/crates/ide-completion/src/render/macro_.rs index 85a0761c17e0..ce8a1aca8325 100644 --- a/crates/ide-completion/src/render/macro_.rs +++ b/crates/ide-completion/src/render/macro_.rs @@ -41,7 +41,10 @@ fn render( ) -> Builder { let source_range = if ctx.is_immediately_after_macro_bang() { cov_mark::hit!(completes_macro_call_if_cursor_at_bang_token); - completion.token.parent().map_or_else(|| ctx.source_range(), |it| it.text_range()) + completion + .token + .parent() + .map_or_else(|| ctx.source_range(), |it| it.text_range_without_outer_trivia()) } else { ctx.source_range() }; diff --git a/crates/ide-completion/src/tests/predicate.rs b/crates/ide-completion/src/tests/predicate.rs index 3f3a6f4cf574..900d80642c5a 100644 --- a/crates/ide-completion/src/tests/predicate.rs +++ b/crates/ide-completion/src/tests/predicate.rs @@ -14,11 +14,13 @@ struct Foo<'lt, T, const C: usize> where $0 {} en Enum Enum ma makro!(…) macro_rules! makro md module:: + sp Self Foo<'lt, T, C> st Foo<…> Foo<'lt, T, C> st Record Record st Tuple Tuple st Unit Unit tt Trait + tp T un Union Union bt u32 u32 kw crate:: @@ -91,11 +93,13 @@ struct Foo<'lt, T, const C: usize> where for<'a> $0 {} en Enum Enum ma makro!(…) macro_rules! makro md module:: + sp Self Foo<'lt, T, C> st Foo<…> Foo<'lt, T, C> st Record Record st Tuple Tuple st Unit Unit tt Trait + tp T un Union Union bt u32 u32 kw crate:: diff --git a/crates/ide-db/src/active_parameter.rs b/crates/ide-db/src/active_parameter.rs index 506645261b8d..8028b904e708 100644 --- a/crates/ide-db/src/active_parameter.rs +++ b/crates/ide-db/src/active_parameter.rs @@ -70,10 +70,10 @@ pub fn callable_for_token<'db>( let offset = token.text_range().start(); // Find the calling expression and its NameRef let parent = token.parent()?; - let calling_node = parent - .ancestors() - .filter_map(ast::CallableExpr::cast) - .find(|it| it.arg_list().is_some_and(|it| it.syntax().text_range().contains(offset)))?; + let calling_node = parent.ancestors().filter_map(ast::CallableExpr::cast).find(|it| { + it.arg_list() + .is_some_and(|it| it.syntax().text_range_without_outer_trivia().contains(offset)) + })?; callable_for_node(sema, &calling_node, offset) } @@ -84,7 +84,7 @@ pub fn callable_for_arg_list<'db>( arg_list: ast::ArgList, at: TextSize, ) -> Option<(hir::Callable<'db>, Option)> { - debug_assert!(arg_list.syntax().text_range().contains(at)); + debug_assert!(arg_list.syntax().text_range_without_outer_trivia().contains(at)); let callable = arg_list.syntax().parent().and_then(ast::CallableExpr::cast)?; callable_for_node(sema, &callable, at) } @@ -176,7 +176,9 @@ pub fn generic_def_for_node( fn into_comma(it: NodeOrToken) -> Option { let token = match it { NodeOrToken::Token(it) => it, - NodeOrToken::Node(node) if node.kind() == SyntaxKind::ERROR => node.first_token()?, + NodeOrToken::Node(node) if node.kind() == SyntaxKind::ERROR => { + node.first_non_trivia_token()? + } NodeOrToken::Node(_) => return None, }; (token.kind() == T![,]).then_some(token) diff --git a/crates/ide-db/src/helpers.rs b/crates/ide-db/src/helpers.rs index 08e4b12176c7..dc4a25d4a223 100644 --- a/crates/ide-db/src/helpers.rs +++ b/crates/ide-db/src/helpers.rs @@ -29,7 +29,7 @@ pub fn pick_best_token( tokens: TokenAtOffset, f: impl Fn(SyntaxKind) -> usize, ) -> Option { - tokens.max_by_key(move |t| f(t.kind())) + tokens.max_by_key(move |t| if t.is_trivia() { 0 } else { f(t.kind()) }) } pub fn pick_token(mut tokens: TokenAtOffset) -> Option { tokens.find_map(T::cast) diff --git a/crates/ide-db/src/imports/insert_use.rs b/crates/ide-db/src/imports/insert_use.rs index bf7aa771c2af..92f254c37437 100644 --- a/crates/ide-db/src/imports/insert_use.rs +++ b/crates/ide-db/src/imports/insert_use.rs @@ -178,11 +178,11 @@ pub fn insert_uses_with_editor( .flat_map(|path| { let use_tree = make.use_tree(path, None, None, false); let use_item = make.use_(None, None, use_tree); - [use_item.syntax().clone().into(), make.whitespace("\n").into()] + [make.with_trailing_trivia(use_item.syntax(), "\n")] }) - .chain([make.whitespace("\n").into()]) .collect(); syntax_editor.insert_all(Position::first_child_of(scope.as_syntax_node()), elements); + syntax_editor.prepend_leading_trivia(scope.as_syntax_node(), "\n"); return; } @@ -459,18 +459,15 @@ fn insert_use_with_editor_( if let Some((.., node)) = post_insert { cov_mark::hit!(insert_group); // insert our import before that element - return syntax_editor.insert_all( - Position::before(node), - vec![use_item.syntax().clone().into(), make.whitespace("\n").into()], - ); + insert_item_before(syntax_editor, &node, use_item.syntax(), "\n"); + return; } if let Some(node) = last { cov_mark::hit!(insert_group_last); // there is no element after our new import, so append it to the end of the group - return syntax_editor.insert_all( - Position::after(node), - vec![make.whitespace("\n").into(), use_item.syntax().clone().into()], - ); + syntax_editor + .insert(Position::after(node), make.with_leading_trivia(use_item.syntax(), "\n")); + return; } // the group we were looking for actually doesn't exist, so insert @@ -482,29 +479,22 @@ fn insert_use_with_editor_( .find(|(use_tree, ..)| ImportGroup::new(use_tree) > group); if let Some((.., node)) = post_group { cov_mark::hit!(insert_group_new_group); - syntax_editor.insert_all( - Position::before(&node), - vec![use_item.syntax().clone().into(), make.whitespace("\n\n").into()], - ); + insert_item_before(syntax_editor, &node, use_item.syntax(), "\n\n"); return; } // there is no such group, so append after the last one if let Some(node) = last { cov_mark::hit!(insert_group_no_group); - syntax_editor.insert_all( - Position::after(&node), - vec![make.whitespace("\n\n").into(), use_item.syntax().clone().into()], - ); + syntax_editor + .insert(Position::after(node), make.with_leading_trivia(use_item.syntax(), "\n\n")); return; } } else { // There exists a group, so append to the end of it if let Some((_, node)) = path_node_iter.last() { cov_mark::hit!(insert_no_grouping_last); - syntax_editor.insert_all( - Position::after(node), - vec![make.whitespace("\n").into(), use_item.syntax().clone().into()], - ); + syntax_editor + .insert(Position::after(node), make.with_leading_trivia(use_item.syntax(), "\n")); return; } } @@ -526,12 +516,8 @@ fn insert_use_with_editor_( NodeOrToken::Node(node) => { is_inner_attribute(node.clone()) && ast::Item::cast(node.clone()).is_none() } - NodeOrToken::Token(token) => { - [SyntaxKind::WHITESPACE, SyntaxKind::COMMENT, SyntaxKind::SHEBANG] - .contains(&token.kind()) - } + NodeOrToken::Token(token) => token.kind() == SyntaxKind::SHEBANG, }) - .filter(|child| child.as_token().is_none_or(|t| t.kind() != SyntaxKind::WHITESPACE)) .last() { cov_mark::hit!(insert_empty_inner_attr); @@ -540,38 +526,109 @@ fn insert_use_with_editor_( } else { IndentLevel::zero() }; - syntax_editor.insert_all( - Position::after(&last_inner_element), - vec![ - make.whitespace(&format!("\n\n{indent}")).into(), - use_item.syntax().clone().into(), - ], + let mut header = String::new(); + if let Some(next) = + last_inner_element.last_non_trivia_token().and_then(|it| it.next_non_trivia_token()) + { + let leading: Vec<_> = next.leading_trivia().collect(); + let end = + leading.iter().rposition(|it| it.kind() == SyntaxKind::COMMENT).map(|comment| { + leading[comment..] + .iter() + .position(|it| it.kind() == SyntaxKind::NEWLINE) + .map_or(leading.len(), |offset| comment + offset + 1) + }); + if let Some(end) = end { + header = leading[..end].iter().map(|it| it.text()).collect(); + syntax_editor.splice_leading_trivia(&next, ..end, []); + } + } + let leading = match header.is_empty() { + true => format!("\n\n{indent}"), + false => format!("\n{}\n\n{indent}", header.trim_end_matches(['\n', '\r'])), + }; + syntax_editor.insert( + Position::after(last_inner_element), + make.with_leading_trivia(use_item.syntax(), &leading), ); } else { match l_curly { Some(b) => { cov_mark::hit!(insert_empty_module); let indent = IndentLevel::from_node(scope_syntax) + 1; - syntax_editor.insert_all( - Position::after(&b), - vec![ - make.whitespace(&format!("\n{indent}")).into(), - use_item.syntax().clone().into(), - make.whitespace("\n").into(), - ], - ); + let item = make.with_leading_trivia(use_item.syntax(), &format!("\n{indent}")); + syntax_editor.insert(Position::after(&b), make.with_trailing_trivia(&item, "\n")); } None => { cov_mark::hit!(insert_empty_file); - syntax_editor.insert_all( - Position::first_child_of(scope_syntax), - vec![use_item.syntax().clone().into(), make.whitespace("\n\n").into()], - ); + let Some(first) = scope_syntax.first_non_trivia_token() else { + syntax_editor.insert( + Position::first_child_of(scope_syntax), + make.with_trailing_trivia(use_item.syntax(), "\n"), + ); + return; + }; + let leading: Vec<_> = first.leading_trivia().collect(); + let header_len = if first.kind() == SyntaxKind::EOF { + leading.len() + } else { + let blank_line = leading + .windows(2) + .rposition(|pair| pair.iter().all(|it| it.kind() == SyntaxKind::NEWLINE)); + let comment = leading + .iter() + .position(|it| it.kind() == SyntaxKind::COMMENT) + .unwrap_or(leading.len()); + blank_line.map_or(comment, |it| comment.max(it + 2)) + }; + let (header, rest) = leading.split_at(header_len); + let header_text: String = header.iter().map(|it| it.text()).collect(); + let header_text = match header.iter().any(|it| it.kind() == SyntaxKind::COMMENT) { + true => format!("{}\n\n", header_text.trim_end_matches('\n')), + false => header_text, + }; + let follows = + header_text.is_empty() || first.kind() != SyntaxKind::EOF || !rest.is_empty(); + + let item = make.with_leading_trivia(use_item.syntax(), &header_text); + let item = match follows { + true => make.with_trailing_trivia(&item, "\n"), + false => item, + }; + syntax_editor.insert(Position::first_child_of(scope_syntax), item); + + let new_leading: Vec<_> = follows + .then_some((SyntaxKind::NEWLINE, "\n")) + .into_iter() + .chain(rest.iter().map(|it| (it.kind(), it.text()))) + .collect(); + if !leading.iter().map(|it| (it.kind(), it.text())).eq(new_leading.iter().copied()) + { + syntax_editor.splice_leading_trivia(&first, .., new_leading); + } } } } } +fn insert_item_before( + editor: &SyntaxEditor, + anchor: &SyntaxNode, + item: &SyntaxNode, + separator: &str, +) { + let make = editor.make(); + let newlines = separator.matches('\n').count(); + let head = match newlines > 1 { + true => &separator[..separator.len() - (newlines - 1)], + false => separator, + }; + editor.insert(Position::before(anchor), make.with_trailing_trivia(item, head)); + if newlines > 1 { + editor.prepend_leading_trivia(anchor, &"\n".repeat(newlines - 1)); + } +} + fn is_inner_attribute(node: SyntaxNode) -> bool { ast::AnyAttr::cast(node).map(|attr| attr.kind()) == Some(ast::AttrKind::Inner) } diff --git a/crates/ide-db/src/imports/merge_imports.rs b/crates/ide-db/src/imports/merge_imports.rs index f9251458fd02..a11074c3e36b 100644 --- a/crates/ide-db/src/imports/merge_imports.rs +++ b/crates/ide-db/src/imports/merge_imports.rs @@ -4,7 +4,6 @@ use std::cmp::Ordering; use itertools::{EitherOrBoth, Itertools}; use parser::T; use syntax::{ - ToSmolStr, ast::{ self, AstNode, HasAttrs, HasName, HasVisibility, PathSegmentKind, syntax_factory::SyntaxFactory, @@ -475,7 +474,9 @@ pub fn common_prefix(lhs: &ast::Path, rhs: &ast::Path) -> Option<(ast::Path, ast let mut rhs_curr = rhs.first_qualifier_or_self(); loop { match (lhs_curr.segment(), rhs_curr.segment()) { - (Some(lhs), Some(rhs)) if lhs.syntax().text() == rhs.syntax().text() => (), + (Some(lhs), Some(rhs)) + if lhs.syntax().text_without_outer_trivia() + == rhs.syntax().text_without_outer_trivia() => {} _ => break res, } res = Some((lhs_curr.clone(), rhs_curr.clone())); @@ -656,8 +657,10 @@ pub fn eq_attrs( attrs0: impl Iterator, attrs1: impl Iterator, ) -> bool { - let mut attrs0: Vec<_> = attrs0.map(|attr| attr.syntax().text().to_smolstr()).collect(); - let mut attrs1: Vec<_> = attrs1.map(|attr| attr.syntax().text().to_smolstr()).collect(); + let mut attrs0: Vec<_> = + attrs0.map(|attr| attr.syntax().text_without_outer_trivia().to_string()).collect(); + let mut attrs1: Vec<_> = + attrs1.map(|attr| attr.syntax().text_without_outer_trivia().to_string()).collect(); attrs0.sort_unstable(); attrs1.sort_unstable(); @@ -700,51 +703,51 @@ fn make_use_tree_list( let source_l_curly = style_source.l_curly_token()?; let source_r_curly = style_source.r_curly_token()?; - let leading_ws = source_l_curly.next_token().filter(|token| token.kind().is_trivia()); - - let trailing_ws = source_r_curly.prev_token().filter(|token| token.kind().is_trivia()); - - let source_trailing_token = trailing_ws - .as_ref() - .and_then(|token| token.prev_token()) - .or_else(|| source_r_curly.prev_token()); + let leading_ws = + source_l_curly.trivia_after().map(|it| it.text().to_owned()).collect::(); + let trailing_ws = + source_r_curly.trivia_before().map(|it| it.text().to_owned()).collect::(); let source_has_trailing_comma = - source_trailing_token.is_some_and(|token| token.kind() == T![,]); + source_r_curly.prev_non_trivia_token().is_some_and(|token| token.kind() == T![,]); let (editor, use_tree_list) = SyntaxEditor::with_ast_node(&use_tree_list); let make = editor.make(); - if let Some(leading_ws) = leading_ws { - editor.insert( - Position::after(use_tree_list.l_curly_token()?), - make.whitespace(leading_ws.text()), - ); - } - let r_curly = use_tree_list.r_curly_token()?; - let generated_has_trailing_comma = r_curly - .prev_token() - .and_then(|token| if token.kind().is_trivia() { token.prev_token() } else { Some(token) }) - .is_some_and(|token| token.kind() == T![,]); + if let Some(l_curly) = use_tree_list.l_curly_token() { + let (trailing, leading) = leading_ws + .find('\n') + .map_or(("", &*leading_ws), |index| (&leading_ws[..=index], &leading_ws[index + 1..])); + editor.splice_trailing_trivia(&l_curly, .., ast::make::tokens::trivia(trailing)); + if let Some(first) = l_curly.next_non_trivia_token() { + editor.splice_leading_trivia(&first, .., ast::make::tokens::trivia(leading)); + } + } - let mut trailing = Vec::new(); + let generated_has_trailing_comma = + r_curly.prev_non_trivia_token().is_some_and(|token| token.kind() == T![,]); + let (trailing, leading) = trailing_ws + .find('\n') + .map_or(("", &*trailing_ws), |index| (&trailing_ws[..=index], &trailing_ws[index + 1..])); + let prev = r_curly.prev_non_trivia_token(); if source_has_trailing_comma && !generated_has_trailing_comma && use_tree_list.use_trees().next().is_some() { - trailing.push(make.token(T![,]).into()); - } - - if let Some(trailing_ws) = trailing_ws { - trailing.push(make.whitespace(trailing_ws.text()).into()); - } - - if !trailing.is_empty() { - editor.insert_all(Position::before(r_curly), trailing); + if let Some(prev) = &prev { + editor.splice_trailing_trivia(prev, .., []); + } + editor.insert( + Position::before(&r_curly), + make.with_trailing_trivia(make.token(T![,]), trailing), + ); + } else if let Some(prev) = &prev { + editor.splice_trailing_trivia(prev, .., ast::make::tokens::trivia(trailing)); } + editor.splice_leading_trivia(&r_curly, .., ast::make::tokens::trivia(leading)); let edit = editor.finish(); ast::UseTreeList::cast(edit.new_root().clone()) diff --git a/crates/ide-db/src/path_transform.rs b/crates/ide-db/src/path_transform.rs index ff32badd7f14..956d5af93dee 100644 --- a/crates/ide-db/src/path_transform.rs +++ b/crates/ide-db/src/path_transform.rs @@ -279,7 +279,9 @@ impl Ctx<'_> { // so that such operation is safe. let (editor, item) = SyntaxEditor::new(self.transform_path(item)); preorder_rev(&item).filter_map(ast::Lifetime::cast).for_each(|lifetime| { - if let Some(subst) = self.lifetime_substs.get(&lifetime.syntax().text().to_string()) { + if let Some(subst) = + self.lifetime_substs.get(&lifetime.syntax().text_without_outer_trivia().to_string()) + { editor.replace(lifetime.syntax(), subst.clone().syntax()); } }); @@ -744,6 +746,6 @@ fn main() { let Alias = (); let Union = (); }"#; - assert_eq_text!(expected, &transformed.to_string()); + assert_eq_text!(expected, &transformed.text_without_outer_trivia().to_string()); } } diff --git a/crates/ide-db/src/rename.rs b/crates/ide-db/src/rename.rs index 16224ae5ee0b..0165ce7e7f30 100644 --- a/crates/ide-db/src/rename.rs +++ b/crates/ide-db/src/rename.rs @@ -568,7 +568,10 @@ fn source_edit_from_name( // FIXME: instead of splitting the shorthand, recursively trigger a rename of the // other name https://github.com/rust-lang/rust-analyzer/issues/6547 - edit.insert(ident_pat.syntax().text_range().start(), format!("{new_name}: ")); + edit.insert( + ident_pat.syntax().text_range_without_outer_trivia().start(), + format!("{new_name}: "), + ); return true; } @@ -600,8 +603,8 @@ fn source_edit_from_name_ref( // same names, we can use a shorthand here instead. // we do not want to erase attributes hence this range start - let s = field_name.syntax().text_range().start(); - let e = init.syntax().text_range().start(); + let s = field_name.syntax().text_range_without_outer_trivia().start(); + let e = init.syntax().text_range_without_outer_trivia().start(); edit.delete(TextRange::new(s, e)); return true; } @@ -612,8 +615,8 @@ fn source_edit_from_name_ref( // same names, we can use a shorthand here instead. // we do not want to erase attributes hence this range start - let s = field_name.syntax().text_range().end(); - let e = init.syntax().text_range().end(); + let s = field_name.syntax().text_range_without_outer_trivia().end(); + let e = init.syntax().text_range_without_outer_trivia().end(); edit.delete(TextRange::new(s, e)); return true; } @@ -623,7 +626,7 @@ fn source_edit_from_name_ref( cov_mark::hit!(test_rename_field_in_field_shorthand); // Foo { field } -> Foo { new_name: field } // ^ insert `new_name: ` - let offset = name_ref.syntax().text_range().start(); + let offset = name_ref.syntax().text_range_without_outer_trivia().start(); edit.insert(offset, format!("{new_name}: ")); return true; } @@ -631,7 +634,7 @@ fn source_edit_from_name_ref( cov_mark::hit!(test_rename_local_in_field_shorthand); // Foo { field } -> Foo { field: new_name } // ^ insert `: new_name` - let offset = name_ref.syntax().text_range().end(); + let offset = name_ref.syntax().text_range_without_outer_trivia().end(); edit.insert(offset, format!(": {new_name}")); return true; } @@ -656,10 +659,10 @@ fn source_edit_from_name_ref( // same names, we can use a shorthand here instead/ // we do not want to erase attributes hence this range start - let s = field_name.syntax().text_range().start(); - let e = pat.syntax().text_range().start(); + let s = field_name.syntax().text_range_without_outer_trivia().start(); + let e = pat.syntax().text_range_without_outer_trivia().start(); edit.delete(TextRange::new(s, e)); - edit.replace(name.syntax().text_range(), new_name); + edit.replace(name.syntax().text_range_without_outer_trivia(), new_name); return true; } } @@ -729,7 +732,7 @@ fn source_edit_from_def<'db>( }; file_id = Some(source.file_id); if let Either::Left(pat) = source.value { - let name_range = pat.name().unwrap().syntax().text_range(); + let name_range = pat.name().unwrap().syntax().text_range_without_outer_trivia(); // special cases required for renaming fields/locals in Record patterns if let Some(pat_field) = pat.syntax().parent().and_then(ast::RecordPatField::cast) { @@ -742,10 +745,9 @@ fn source_edit_from_def<'db>( // ^^^^^ replace this with `field` cov_mark::hit!(test_rename_local_put_init_shorthand_pat); edit.delete( - name_ref - .syntax() - .text_range() - .cover_offset(pat.syntax().text_range().start()), + name_ref.syntax().text_range_without_outer_trivia().cover_offset( + pat.syntax().text_range_without_outer_trivia().start(), + ), ); edit.replace(name_range, name_ref.text().to_owned()); } else { @@ -764,7 +766,7 @@ fn source_edit_from_def<'db>( // original_ast_node_rootedd: ` // ^^^^^ replace this with `new_name` edit.insert( - pat.syntax().text_range().start(), + pat.syntax().text_range_without_outer_trivia().start(), format!("{}: ", pat_field.field_name().unwrap()), ); edit.replace( diff --git a/crates/ide-db/src/search.rs b/crates/ide-db/src/search.rs index c2cc9d717869..92416f71837e 100644 --- a/crates/ide-db/src/search.rs +++ b/crates/ide-db/src/search.rs @@ -85,9 +85,9 @@ pub enum FileReferenceNode { impl FileReferenceNode { pub fn text_range(&self) -> TextRange { match self { - FileReferenceNode::Name(it) => it.syntax().text_range(), - FileReferenceNode::NameRef(it) => it.syntax().text_range(), - FileReferenceNode::Lifetime(it) => it.syntax().text_range(), + FileReferenceNode::Name(it) => it.syntax().text_range_without_outer_trivia(), + FileReferenceNode::NameRef(it) => it.syntax().text_range_without_outer_trivia(), + FileReferenceNode::Lifetime(it) => it.syntax().text_range_without_outer_trivia(), FileReferenceNode::FormatStringEntry(_, range) => *range, } } @@ -412,8 +412,8 @@ impl<'db> Definition<'db> { } let range = match module_source { - ModuleSource::Module(m) => Some(m.syntax().text_range()), - ModuleSource::BlockExpr(b) => Some(b.syntax().text_range()), + ModuleSource::Module(m) => Some(m.syntax().text_range_without_outer_trivia()), + ModuleSource::BlockExpr(b) => Some(b.syntax().text_range_without_outer_trivia()), ModuleSource::SourceFile(_) => None, }; match range { @@ -712,7 +712,7 @@ impl<'a, 'db> FindUsages<'a, 'db> { }) { if seen.insert(InFileWrapper::new( file_id, - alias.syntax().text_range(), + alias.syntax().text_range_without_outer_trivia(), )) { tracing::debug!("found alias: {alias}"); cov_mark::hit!(container_use_rename); @@ -725,8 +725,10 @@ impl<'a, 'db> FindUsages<'a, 'db> { } else if let Some(alias) = usage.ancestors().find_map(ast::TypeAlias::cast) && let Some(name) = alias.name() - && seen - .insert(InFileWrapper::new(file_id, name.syntax().text_range())) + && seen.insert(InFileWrapper::new( + file_id, + name.syntax().text_range_without_outer_trivia(), + )) { if let Some(def) = is_alias(&alias) { cov_mark::hit!(container_type_alias); @@ -789,7 +791,7 @@ impl<'a, 'db> FindUsages<'a, 'db> { } if seen.insert(InFileWrapper::new( file_id, - name.syntax().text_range(), + name.syntax().text_range_without_outer_trivia(), )) { if let Some(def) = is_alias(&type_alias) { cov_mark::hit!(self_type_alias); @@ -864,7 +866,10 @@ impl<'a, 'db> FindUsages<'a, 'db> { .map(|path_segment| { container_predicate( path_segment.parent_path().syntax(), - InFileWrapper::new(file_id, usage.syntax().text_range()), + InFileWrapper::new( + file_id, + usage.syntax().text_range_without_outer_trivia(), + ), ) }) .unwrap_or(false); @@ -1088,8 +1093,12 @@ impl<'a, 'db> FindUsages<'a, 'db> { let src = module.definition_source(sema.db); let file_id = src.file_id.original_file(sema.db); let (file_id, search_range) = match src.value { - ModuleSource::Module(m) => (file_id, Some(m.syntax().text_range())), - ModuleSource::BlockExpr(b) => (file_id, Some(b.syntax().text_range())), + ModuleSource::Module(m) => { + (file_id, Some(m.syntax().text_range_without_outer_trivia())) + } + ModuleSource::BlockExpr(b) => { + (file_id, Some(b.syntax().text_range_without_outer_trivia())) + } ModuleSource::SourceFile(_) => (file_id, None), }; @@ -1415,7 +1424,7 @@ impl ReferenceCategory { // If the variable or field ends on the LHS's end then it's a Write // (covers fields and locals). FIXME: This is not terribly accurate. if let Some(lhs) = expr.lhs() - && lhs.syntax().text_range().contains_range(r.syntax().text_range()) { + && lhs.syntax().text_range_without_outer_trivia().contains_range(r.syntax().text_range_without_outer_trivia()) { return Some(ReferenceCategory::WRITE) } } diff --git a/crates/ide-db/src/source_change.rs b/crates/ide-db/src/source_change.rs index 58f459003ec4..8b54aa8759fc 100644 --- a/crates/ide-db/src/source_change.rs +++ b/crates/ide-db/src/source_change.rs @@ -268,17 +268,20 @@ impl SourceChangeBuilder { let snippet = match (kind, elements) { (AnnotationSnippet::Before, [element]) => { - Snippet::Tabstop(element.text_range().start()) + Snippet::Tabstop(element.text_range_without_outer_trivia().start()) } (AnnotationSnippet::After, [element]) => { - Snippet::Tabstop(element.text_range().end()) + Snippet::Tabstop(element.text_range_without_outer_trivia().end()) } (AnnotationSnippet::Over, [element]) => { - Snippet::Placeholder(element.text_range()) + Snippet::Placeholder(element.text_range_without_outer_trivia()) } (AnnotationSnippet::Over, elements) if !elements.is_empty() => { Snippet::PlaceholderGroup( - elements.iter().map(|it| it.text_range()).collect(), + elements + .iter() + .map(|it| it.text_range_without_outer_trivia()) + .collect(), ) } _ => continue, @@ -319,7 +322,26 @@ impl SourceChangeBuilder { self.edit.replace(range, replace_with.into()) } pub fn replace_ast(&mut self, old: N, new: N) { - diff(old.syntax(), new.syntax()).into_text_edit(&mut self.edit) + let range = old.syntax().text_range_without_outer_trivia(); + let (editor, new) = SyntaxEditor::new(new.syntax().clone()); + if let Some(first) = new.first_non_trivia_token() { + editor.splice_leading_trivia(&first, .., []); + } + if let Some(last) = new.last_non_trivia_token() { + editor.splice_trailing_trivia(&last, .., []); + } + let new = editor.finish().new_root().clone(); + let mut edit = TextEdit::builder(); + diff(old.syntax(), &new).into_text_edit(&mut edit); + for indel in edit.finish() { + let delete = TextRange::new( + indel.delete.start().clamp(range.start(), range.end()), + indel.delete.end().clamp(range.start(), range.end()), + ); + if !delete.is_empty() || !indel.insert.is_empty() { + self.edit.replace(delete, indel.insert); + } + } } pub fn create_file(&mut self, dst: AnchoredPathBuf, content: impl Into) { let file_system_edit = FileSystemEdit::CreateFile { dst, initial_contents: content.into() }; diff --git a/crates/ide-db/src/syntax_helpers/node_ext.rs b/crates/ide-db/src/syntax_helpers/node_ext.rs index 15ecabc33c81..e2489c2f4d22 100644 --- a/crates/ide-db/src/syntax_helpers/node_ext.rs +++ b/crates/ide-db/src/syntax_helpers/node_ext.rs @@ -2,14 +2,13 @@ use std::ops::ControlFlow; use either::Either; + use itertools::Itertools; use parser::T; use span::Edition; use syntax::{ - AstNode, AstToken, Direction, Preorder, RustLanguage, SyntaxToken, WalkEvent, - algo::non_trivia_sibling, + AstNode, AstToken, Preorder, RustLanguage, SyntaxToken, WalkEvent, ast::{self, HasLoopBody, MacroCall, PathSegmentKind, VisibilityKind}, - syntax_editor::Element, }; pub fn expr_as_name_ref(expr: &ast::Expr) -> Option { @@ -559,7 +558,7 @@ pub fn is_in_macro_matcher(token: &SyntaxToken) -> bool { let Some(body) = (match macro_def { ast::Macro::MacroDef(macro_def) => { if let Some(args) = macro_def.args() { - return args.syntax().text_range().contains_range(range); + return args.syntax().text_range_without_outer_trivia().contains_range(range); } macro_def.body() } @@ -567,16 +566,16 @@ pub fn is_in_macro_matcher(token: &SyntaxToken) -> bool { }) else { return false; }; - if !body.syntax().text_range().contains_range(range) { + if !body.syntax().text_range_without_outer_trivia().contains_range(range) { return false; } body.token_trees_and_tokens().filter_map(|tt| tt.into_node()).any(|tt| { - let Some(next) = non_trivia_sibling(tt.syntax().syntax_element(), Direction::Next) else { + let Some(next) = tt.syntax().next_sibling_or_token() else { return false; }; let Some(next_next) = next.next_sibling_or_token() else { return false }; next.kind() == T![=] && next_next.kind() == T![>] - && tt.syntax().text_range().contains_range(range) + && tt.syntax().text_range_without_outer_trivia().contains_range(range) }) } diff --git a/crates/ide-db/src/syntax_helpers/suggest_name.rs b/crates/ide-db/src/syntax_helpers/suggest_name.rs index 42bfc7fe4b21..c9a2a9f6393c 100644 --- a/crates/ide-db/src/syntax_helpers/suggest_name.rs +++ b/crates/ide-db/src/syntax_helpers/suggest_name.rs @@ -195,7 +195,10 @@ impl NameGenerator { .type_bound_list() .and_then(|bounds| { let ty = bounds.bounds().next()?.ty()?; - ty.syntax().text().char_at(0.into()).filter(|ch| ch.is_alphabetic()) + ty.syntax() + .text_without_outer_trivia() + .char_at(0.into()) + .filter(|ch| ch.is_alphabetic()) }) .unwrap_or('T'); @@ -512,7 +515,7 @@ mod tests { let expr = element.ancestors().find_map(ast::Expr::cast).expect("selection is not an expression"); assert_eq!( - expr.syntax().text_range(), + expr.syntax().text_range_without_outer_trivia(), frange.range, "selection is not an expression(yet contained in one)" ); diff --git a/crates/ide-db/src/syntax_helpers/tree_diff.rs b/crates/ide-db/src/syntax_helpers/tree_diff.rs index af893f1ea5f3..f92898a28d1c 100644 --- a/crates/ide-db/src/syntax_helpers/tree_diff.rs +++ b/crates/ide-db/src/syntax_helpers/tree_diff.rs @@ -1,6 +1,6 @@ //! Basic tree diffing functionality. use rustc_hash::FxHashMap; -use syntax::{NodeOrToken, SyntaxElement, SyntaxNode}; +use syntax::{NodeOrToken, SyntaxElement, SyntaxKind, SyntaxNode, TextRange}; use crate::{FxIndexMap, text_edit::TextEditBuilder}; @@ -24,15 +24,26 @@ impl TreeDiff { for (anchor, to) in &self.insertions { let offset = match anchor { - TreeDiffInsertPos::After(it) => it.text_range().end(), - TreeDiffInsertPos::AsFirstChild(it) => it.text_range().start(), + TreeDiffInsertPos::After(it) => it.text_range_including_trivia().end(), + TreeDiffInsertPos::AsFirstChild(it) => it.text_range_including_trivia().start(), }; to.iter().for_each(|to| builder.insert(offset, to.to_string())); } for (from, to) in &self.replacements { - builder.replace(from.text_range(), to.to_string()); + if let (Some(old), Some(new)) = (from.as_token(), to.as_token()) + && old.kind() == new.kind() + && old.text() == new.text() + && old.green().trailing_trivia() == new.green().trailing_trivia() + { + let full = old.text_range_including_trivia(); + let core = old.text_range(); + let leading = new.leading_trivia().map(|it| it.text().to_owned()).collect(); + builder.replace(TextRange::new(full.start(), core.start()), leading); + continue; + } + builder.replace(from.text_range_including_trivia(), to.to_string()); } - for text_range in self.deletions.iter().map(SyntaxElement::text_range) { + for text_range in self.deletions.iter().map(SyntaxElement::text_range_including_trivia) { builder.delete(text_range); } } @@ -63,14 +74,25 @@ pub fn diff(from: &SyntaxNode, to: &SyntaxNode) -> TreeDiff { } return diff; + fn syntax_element_core_eq(lhs: &SyntaxElement, rhs: &SyntaxElement) -> bool { + lhs.kind() == rhs.kind() + && match (&lhs, &rhs) { + (NodeOrToken::Node(lhs), NodeOrToken::Node(rhs)) => { + lhs == rhs || lhs.text_without_outer_trivia() == rhs.text_without_outer_trivia() + } + (NodeOrToken::Token(lhs), NodeOrToken::Token(rhs)) => lhs.text() == rhs.text(), + _ => false, + } + } + fn syntax_element_eq(lhs: &SyntaxElement, rhs: &SyntaxElement) -> bool { lhs.kind() == rhs.kind() - && lhs.text_range().len() == rhs.text_range().len() + && lhs.text_range_including_trivia().len() == rhs.text_range_including_trivia().len() && match (&lhs, &rhs) { (NodeOrToken::Node(lhs), NodeOrToken::Node(rhs)) => { lhs == rhs || lhs.text() == rhs.text() } - (NodeOrToken::Token(lhs), NodeOrToken::Token(rhs)) => lhs.text() == rhs.text(), + (NodeOrToken::Token(lhs), NodeOrToken::Token(rhs)) => lhs.green() == rhs.green(), _ => false, } } @@ -88,12 +110,21 @@ pub fn diff(from: &SyntaxNode, to: &SyntaxNode) -> TreeDiff { let mut look_ahead_scratch = Vec::default(); - let mut rhs_children = rhs.children_with_tokens(); + let mut rhs_children = rhs.children_with_tokens().peekable(); let mut lhs_children = lhs.children_with_tokens(); let mut last_lhs = None; loop { let lhs_child = lhs_children.next(); - match (lhs_child.clone(), rhs_children.next()) { + let rhs_child = match rhs_children.peek() { + Some(eof) + if eof.kind() == SyntaxKind::EOF + && lhs_child.as_ref().is_some_and(|it| it.kind() != SyntaxKind::EOF) => + { + None + } + _ => rhs_children.next(), + }; + match (lhs_child.clone(), rhs_child) { (None, None) => break, (None, Some(element)) => { let insert_pos = match last_lhs.clone() { @@ -102,10 +133,7 @@ pub fn diff(from: &SyntaxNode, to: &SyntaxNode) -> TreeDiff { TreeDiffInsertPos::After(prev) } // first iteration, insert into out parent as the first child - None => { - cov_mark::hit!(diff_insert_as_first_child); - TreeDiffInsertPos::AsFirstChild(lhs.clone().into()) - } + None => TreeDiffInsertPos::AsFirstChild(lhs.clone().into()), }; diff.insertions.entry(insert_pos).or_default().push(element); } @@ -121,28 +149,32 @@ pub fn diff(from: &SyntaxNode, to: &SyntaxNode) -> TreeDiff { // use insertions as we do not want to replace the entire module node. look_ahead_scratch.push(rhs_ele.clone()); let mut rhs_children_clone = rhs_children.clone(); - let mut insert = false; + let mut matched = None; for rhs_child in &mut rhs_children_clone { - if syntax_element_eq(&lhs_ele, &rhs_child) { + if syntax_element_core_eq(&lhs_ele, &rhs_child) { cov_mark::hit!(diff_insertions); - insert = true; + matched = Some(rhs_child); break; } look_ahead_scratch.push(rhs_child); } - let drain = look_ahead_scratch.drain(..); - if insert { - let insert_pos = if let Some(prev) = last_lhs.clone().filter(|_| insert) { - TreeDiffInsertPos::After(prev) - } else { - cov_mark::hit!(insert_first_child); - TreeDiffInsertPos::AsFirstChild(lhs.clone().into()) - }; - - diff.insertions.entry(insert_pos).or_default().extend(drain); - rhs_children = rhs_children_clone; - } else { - go(diff, lhs_ele, rhs_ele); + let drain = std::mem::take(&mut look_ahead_scratch); + match matched { + Some(matched) => { + let insert_pos = if let Some(prev) = last_lhs.clone() { + TreeDiffInsertPos::After(prev) + } else { + cov_mark::hit!(insert_first_child); + TreeDiffInsertPos::AsFirstChild(lhs.clone().into()) + }; + + diff.insertions.entry(insert_pos).or_default().extend(drain); + rhs_children = rhs_children_clone; + if !syntax_element_eq(&lhs_ele, &matched) { + go(diff, lhs_ele, matched); + } + } + None => go(diff, lhs_ele, rhs_ele), } } } @@ -155,7 +187,7 @@ pub fn diff(from: &SyntaxNode, to: &SyntaxNode) -> TreeDiff { mod tests { use expect_test::{Expect, expect}; use itertools::Itertools; - use parser::{Edition, SyntaxKind}; + use parser::Edition; use syntax::{AstNode, SourceFile, SyntaxElement}; use crate::text_edit::TextEdit; @@ -173,20 +205,19 @@ mod tests { replacements: - Line 0: Token(USE_KW@0..3 "use") -> ident + Line 0: Token(USE_KW@0..3 "use" [] [WHITESPACE(" ")]) -> "ident" deletions: - Line 1: " " - Line 1: node - Line 1: ; + Line 1: "node" + Line 1: ";" "#]], ); } #[test] fn replace_parent() { - cov_mark::check!(diff_insert_as_first_child); + cov_mark::check!(insert_first_child); check_diff( r#""#, r#"use foo::bar;"#, @@ -194,7 +225,7 @@ mod tests { insertions: Line 0: AsFirstChild(Node(SOURCE_FILE@0..0)) - -> use foo::bar; + -> "use foo::bar;" replacements: @@ -209,7 +240,7 @@ mod tests { #[test] fn insert_last() { - cov_mark::check!(diff_insert); + cov_mark::check!(diff_insertions); check_diff( r#" use foo; @@ -222,12 +253,11 @@ use baz;"#, insertions: Line 2: After(Node(USE@10..18)) - -> "\n" - -> use baz; + -> "use baz;" replacements: - + Line 3: Token(SEMICOLON@17..18 ";") -> ";\n" deletions: @@ -249,9 +279,8 @@ use baz;"#, expect![[r#" insertions: - Line 2: After(Token(WHITESPACE@9..10 "\n")) - -> use bar; - -> "\n" + Line 0: After(Node(USE@0..10)) + -> "use bar;\n" replacements: @@ -277,13 +306,12 @@ use baz;"#, expect![[r#" insertions: - Line 0: After(Token(WHITESPACE@0..1 "\n")) - -> use foo; - -> "\n" + Line 0: AsFirstChild(Node(SOURCE_FILE@0..18)) + -> "\nuse foo;\n" replacements: - + Line 1: Token(USE_KW@1..4 "use" [NEWLINE("\n")] [WHITESPACE(" ")]) -> "use " deletions: @@ -308,12 +336,11 @@ use baz;"#, insertions: Line 0: AsFirstChild(Node(SOURCE_FILE@0..30)) - -> use foo::bar; - -> "\n\n " + -> "use foo::bar;\n" replacements: - + Line 0: Token(FN_KW@0..2 "fn" [] [WHITESPACE(" ")]) -> "\n fn " deletions: @@ -336,19 +363,18 @@ use baz;"#, replacements: - + Line 1: Token(SEMICOLON@7..8 ";" [] [NEWLINE("\n")]) -> ";" deletions: - Line 1: "\n " - Line 2: use bar; + Line 1: " use bar;" "#]], ); } #[test] fn delete_middle() { - cov_mark::check!(diff_insertions); + cov_mark::check!(diff_delete); check_diff( r#" use expect_test::{expect, Expect}; @@ -364,20 +390,17 @@ use crate::AstNode; expect![[r#" insertions: - Line 1: After(Node(USE@1..35)) - -> "\n\n" - -> use crate::AstNode; - replacements: + replacements: + Line 2: Token(USE_KW@36..39 "use" [] [WHITESPACE(" ")]) -> "\nuse " + Line 3: Token(IDENT@40..49 "text_edit") -> "crate" + Line 3: Token(IDENT@51..59 "TextEdit") -> "AstNode" deletions: - Line 2: use text_edit::TextEdit; - Line 3: "\n\n" - Line 4: use crate::AstNode; - Line 5: "\n" + Line 3: "\nuse crate::AstNode;\n" "#]], ) } @@ -400,20 +423,19 @@ use crate::AstNode; replacements: - Line 2: Token(IDENT@5..14 "text_edit") -> crate - Line 2: Token(IDENT@16..24 "TextEdit") -> AstNode - Line 2: Token(WHITESPACE@25..27 "\n\n") -> "\n" + Line 2: Token(IDENT@5..14 "text_edit") -> "crate" + Line 2: Token(IDENT@16..24 "TextEdit") -> "AstNode" deletions: - Line 3: use crate::AstNode; - Line 4: "\n" + Line 2: "\nuse crate::AstNode;\n" "#]], ) } #[test] fn merge_use() { + cov_mark::check!(diff_insert); check_diff( r#" use std::{ @@ -431,26 +453,20 @@ use std::ops::{self, RangeInclusive}; insertions: Line 2: After(Node(PATH_SEGMENT@5..8)) - -> :: - -> fmt - Line 6: After(Token(WHITESPACE@86..87 "\n")) - -> use std::hash::BuildHasherDefault; - -> "\n" - -> use std::ops::{self, RangeInclusive}; - -> "\n" + -> "::" + -> "fmt" + Line 0: After(Node(USE@0..87)) + -> "use std::hash::BuildHasherDefault;\n" + -> "use std::ops::{self, RangeInclusive};\n" replacements: - Line 2: Token(IDENT@5..8 "std") -> std + Line 2: Token(IDENT@5..8 "std") -> "std" deletions: - Line 2: :: - Line 2: { - fmt, - hash::BuildHasherDefault, - ops::{self, RangeInclusive}, - } + Line 2: "::" + Line 2: "{\n fmt,\n hash::BuildHasherDefault,\n ops::{self, RangeInclusive},\n}" "#]], ) } @@ -477,31 +493,23 @@ fn main() { expect![[r#" insertions: - Line 3: After(Node(BLOCK_EXPR@40..63)) - -> " " - -> match Err(92) { - Ok(it) => it, - _ => return, - } - -> ; - Line 3: After(Node(IF_EXPR@17..63)) - -> "\n " - -> foo(x); + Line 3: After(Node(BLOCK_EXPR@40..64)) + -> "match Err(92) {\n Ok(it) => it,\n _ => return,\n }" + -> ";\n" + Line 2: After(Node(IF_EXPR@13..64)) + -> " foo(x);\n" replacements: - Line 3: Token(IF_KW@17..19 "if") -> let - Line 3: Token(LET_KW@20..23 "let") -> x - Line 3: Node(BLOCK_EXPR@40..63) -> = + Line 3: Token(IF_KW@17..19 "if" [WHITESPACE(" ")] [WHITESPACE(" ")]) -> " let " + Line 3: Token(LET_KW@20..23 "let" [] [WHITESPACE(" ")]) -> "x " + Line 3: Node(BLOCK_EXPR@40..64) -> "= " deletions: - Line 3: " " - Line 3: Ok(x) - Line 3: " " - Line 3: = - Line 3: " " - Line 3: Err(92) + Line 3: "Ok(x) " + Line 3: "= " + Line 3: "Err(92) " "#]], ) } @@ -514,10 +522,7 @@ fn main() { let line_number = |syn: &SyntaxElement| from[..syn.text_range().start().into()].lines().count(); - let fmt_syntax = |syn: &SyntaxElement| match syn.kind() { - SyntaxKind::WHITESPACE => format!("{:?}", syn.to_string()), - _ => format!("{syn}"), - }; + let fmt_syntax = |syn: &SyntaxElement| format!("{:?}", syn.to_string()); let insertions = diff.insertions.iter().format_with("\n", |(k, v), f| -> Result<(), std::fmt::Error> { diff --git a/crates/ide-diagnostics/src/handlers/explicit_drop_method_use.rs b/crates/ide-diagnostics/src/handlers/explicit_drop_method_use.rs index 5ab30fffe76d..d47e80df16b5 100644 --- a/crates/ide-diagnostics/src/handlers/explicit_drop_method_use.rs +++ b/crates/ide-diagnostics/src/handlers/explicit_drop_method_use.rs @@ -21,7 +21,7 @@ pub(crate) fn explicit_drop_method_use( match d.expr_or_path { Either::Left(expr) => { let display_range = adjusted_display_range(ctx, expr, &|node| { - Some(node.name_ref()?.syntax().text_range()) + Some(node.name_ref()?.syntax().text_range_without_outer_trivia()) }); Diagnostic::new( DiagnosticCode::RustcHardError("E0040"), @@ -58,7 +58,7 @@ fn fix_method_call( let file_id = mcall_ptr.file_id; let mcall = mcall_ptr.to_node(db); - let range = mcall.syntax().text_range(); + let range = mcall.syntax().text_range_without_outer_trivia(); // `mcall` is `foo.drop()` -- extract the receiver, and wrap it in `drop()` // NOTE: it could theoretically be `(&mut foo).drop()` instead, in which case the fix @@ -102,7 +102,7 @@ fn fix_path( }; let recv = ref_recv.expr()?; - let range = call.syntax().text_range(); + let range = call.syntax().text_range_without_outer_trivia(); let mut builder = SourceChangeBuilder::new(file_id.original_file(db).file_id(db)); let editor = builder.make_editor(call.syntax()); @@ -116,7 +116,7 @@ fn fix_path( // `path` could be the `Foo::drop` in `let d = Foo::drop;` // -- replace the path with `drop` - let range = InFile::new(file_id, path.syntax().text_range()) + let range = InFile::new(file_id, path.syntax().text_range_without_outer_trivia()) .original_node_file_range_rooted_opt(db)?; let edit = TextEdit::replace(range.range, "drop".to_owned()); diff --git a/crates/ide-diagnostics/src/handlers/field_shorthand.rs b/crates/ide-diagnostics/src/handlers/field_shorthand.rs index 0c77fbbd555b..04317ddb00e6 100644 --- a/crates/ide-diagnostics/src/handlers/field_shorthand.rs +++ b/crates/ide-diagnostics/src/handlers/field_shorthand.rs @@ -39,19 +39,20 @@ fn check_expr_field_shorthand( None => continue, }; - let field_name = name_ref.syntax().text().to_string(); - let field_expr = expr.syntax().text().to_string(); + let field_name = name_ref.syntax().text_without_outer_trivia().to_string(); + let field_expr = expr.syntax().text_without_outer_trivia().to_string(); let field_name_is_tup_index = name_ref.as_tuple_field().is_some(); if field_name != field_expr || field_name_is_tup_index { continue; } let mut edit_builder = TextEdit::builder(); - edit_builder.delete(record_field.syntax().text_range()); - edit_builder.insert(record_field.syntax().text_range().start(), field_name); + edit_builder.delete(record_field.syntax().text_range_without_outer_trivia()); + edit_builder + .insert(record_field.syntax().text_range_without_outer_trivia().start(), field_name); let edit = edit_builder.finish(); - let field_range = record_field.syntax().text_range(); + let field_range = record_field.syntax().text_range_without_outer_trivia(); let vfs_file_id = file_id.file_id(db); acc.push( Diagnostic::new( @@ -85,19 +86,22 @@ fn check_pat_field_shorthand( None => continue, }; - let field_name = name_ref.syntax().text().to_string(); - let field_pat = pat.syntax().text().to_string(); + let field_name = name_ref.syntax().text_without_outer_trivia().to_string(); + let field_pat = pat.syntax().text_without_outer_trivia().to_string(); let field_name_is_tup_index = name_ref.as_tuple_field().is_some(); if field_name != field_pat || field_name_is_tup_index { continue; } let mut edit_builder = TextEdit::builder(); - edit_builder.delete(record_pat_field.syntax().text_range()); - edit_builder.insert(record_pat_field.syntax().text_range().start(), field_name); + edit_builder.delete(record_pat_field.syntax().text_range_without_outer_trivia()); + edit_builder.insert( + record_pat_field.syntax().text_range_without_outer_trivia().start(), + field_name, + ); let edit = edit_builder.finish(); - let field_range = record_pat_field.syntax().text_range(); + let field_range = record_pat_field.syntax().text_range_without_outer_trivia(); let vfs_file_id = file_id.file_id(db); acc.push( Diagnostic::new( diff --git a/crates/ide-diagnostics/src/handlers/generic_args_prohibited.rs b/crates/ide-diagnostics/src/handlers/generic_args_prohibited.rs index d3621f077599..afdc91fc2570 100644 --- a/crates/ide-diagnostics/src/handlers/generic_args_prohibited.rs +++ b/crates/ide-diagnostics/src/handlers/generic_args_prohibited.rs @@ -46,18 +46,18 @@ fn fixes(ctx: &DiagnosticsContext<'_, '_>, d: &hir::GenericArgsProhibited) -> Op let file_id = d.args.file_id.file_id()?; let syntax = d.args.to_node(ctx.sema.db); let range = match &syntax { - Either::Left(_) => syntax.syntax().text_range(), + Either::Left(_) => syntax.syntax().text_range_without_outer_trivia(), Either::Right(param_list) => { let path_segment = ast::PathSegment::cast(param_list.syntax().parent()?)?; let start = if let Some(coloncolon) = path_segment.coloncolon_token() { coloncolon.text_range().start() } else { - param_list.syntax().text_range().start() + param_list.syntax().text_range_without_outer_trivia().start() }; let end = if let Some(ret_type) = path_segment.ret_type() { - ret_type.syntax().text_range().end() + ret_type.syntax().text_range_without_outer_trivia().end() } else { - param_list.syntax().text_range().end() + param_list.syntax().text_range_without_outer_trivia().end() }; TextRange::new(start, end) } @@ -66,7 +66,7 @@ fn fixes(ctx: &DiagnosticsContext<'_, '_>, d: &hir::GenericArgsProhibited) -> Op "remove_generic_args", "Remove these generics", SourceChange::from_text_edit(file_id.file_id(ctx.sema.db), TextEdit::delete(range)), - syntax.syntax().text_range(), + syntax.syntax().text_range_without_outer_trivia(), )]) } diff --git a/crates/ide-diagnostics/src/handlers/incoherent_impl.rs b/crates/ide-diagnostics/src/handlers/incoherent_impl.rs index bd8b804af436..743916198fa2 100644 --- a/crates/ide-diagnostics/src/handlers/incoherent_impl.rs +++ b/crates/ide-diagnostics/src/handlers/incoherent_impl.rs @@ -12,8 +12,8 @@ pub(crate) fn incoherent_impl( ) -> Diagnostic { let display_range = adjusted_display_range(ctx, InFile::new(d.file_id, d.impl_), &|node| { Some(TextRange::new( - node.syntax().text_range().start(), - node.self_ty()?.syntax().text_range().end(), + node.syntax().text_range_without_outer_trivia().start(), + node.self_ty()?.syntax().text_range_without_outer_trivia().end(), )) }); diff --git a/crates/ide-diagnostics/src/handlers/json_is_not_rust.rs b/crates/ide-diagnostics/src/handlers/json_is_not_rust.rs index 52532172ccda..f339cb274ba9 100644 --- a/crates/ide-diagnostics/src/handlers/json_is_not_rust.rs +++ b/crates/ide-diagnostics/src/handlers/json_is_not_rust.rs @@ -119,15 +119,14 @@ pub(crate) fn json_in_items( ) { (|| { if node.kind() == SyntaxKind::ERROR - && node.first_token().map(|x| x.kind()) == Some(SyntaxKind::L_CURLY) - && node.last_token().map(|x| x.kind()) == Some(SyntaxKind::R_CURLY) + && node.first_non_trivia_token().map(|x| x.kind()) == Some(SyntaxKind::L_CURLY) + && node.last_non_trivia_token().map(|x| x.kind()) == Some(SyntaxKind::R_CURLY) { - let node_string = node.to_string(); + let node_string = node.text_without_outer_trivia().to_string(); if let Ok(serde_json::Value::Object(it)) = serde_json::from_str(&node_string) { let import_scope = ImportScope::find_insert_use_container(node, sema)?; - let range = node.text_range(); + let range = node.text_range_without_outer_trivia(); let mut edit = TextEdit::builder(); - edit.delete(range); let mut state = State::default(); let semantics_scope = sema.scope(node)?; let scope_resolve = @@ -139,7 +138,7 @@ pub(crate) fn json_in_items( state.has_serialize = serialize_resolved.is_some(); state.edition = Some(edition); state.build_struct("Root", &it); - edit.insert(range.start(), state.result); + edit.replace(range, state.result); let vfs_file_id = file_id.file_id(sema.db); acc.push( Diagnostic::new( diff --git a/crates/ide-diagnostics/src/handlers/mismatched_arg_count.rs b/crates/ide-diagnostics/src/handlers/mismatched_arg_count.rs index a577353e27cf..41ef3b2c725f 100644 --- a/crates/ide-diagnostics/src/handlers/mismatched_arg_count.rs +++ b/crates/ide-diagnostics/src/handlers/mismatched_arg_count.rs @@ -61,17 +61,23 @@ fn invalid_args_range( Either::Left(ast::Expr::CallExpr(call)) => { let arg_list = call.arg_list()?; ( - arg_list.syntax().text_range(), + arg_list.syntax().text_range_without_outer_trivia(), arg_list.r_paren_token(), - arg_list.args().nth(expected).map(|it| it.syntax().text_range()), + arg_list + .args() + .nth(expected) + .map(|it| it.syntax().text_range_without_outer_trivia()), ) } Either::Left(ast::Expr::MethodCallExpr(call)) => { let arg_list = call.arg_list()?; ( - arg_list.syntax().text_range(), + arg_list.syntax().text_range_without_outer_trivia(), arg_list.r_paren_token(), - arg_list.args().nth(expected).map(|it| it.syntax().text_range()), + arg_list + .args() + .nth(expected) + .map(|it| it.syntax().text_range_without_outer_trivia()), ) } Either::Right(ast::Pat::TupleStructPat(pat)) => { @@ -80,7 +86,9 @@ fn invalid_args_range( ( l_paren.text_range().cover(r_paren.text_range()), Some(r_paren), - pat.fields().nth(expected).map(|it| it.syntax().text_range()), + pat.fields() + .nth(expected) + .map(|it| it.syntax().text_range_without_outer_trivia()), ) } _ => return None, diff --git a/crates/ide-diagnostics/src/handlers/missing_unsafe.rs b/crates/ide-diagnostics/src/handlers/missing_unsafe.rs index abdee7da3fb6..551c9af25423 100644 --- a/crates/ide-diagnostics/src/handlers/missing_unsafe.rs +++ b/crates/ide-diagnostics/src/handlers/missing_unsafe.rs @@ -52,18 +52,25 @@ fn fixes(ctx: &DiagnosticsContext<'_, '_>, d: &hir::MissingUnsafe) -> Option Option bool { let node = expr.syntax(); node.ancestors() .skip(1) - .take_while(|it| it.text_range().start() == node.text_range().start()) + .take_while(|it| { + it.text_range_without_outer_trivia().start() + == node.text_range_without_outer_trivia().start() + }) .map_while(ast::Expr::cast) .last() .and_then(|it| Some(it.syntax().parent()?.kind())) diff --git a/crates/ide-diagnostics/src/handlers/no_such_field.rs b/crates/ide-diagnostics/src/handlers/no_such_field.rs index d61c52434118..a3fd7517b13e 100644 --- a/crates/ide-diagnostics/src/handlers/no_such_field.rs +++ b/crates/ide-diagnostics/src/handlers/no_such_field.rs @@ -103,7 +103,7 @@ fn missing_record_expr_field_fixes( ); let after = if let Some(last_field) = record_fields.fields().last() { - last_field.syntax().last_token()? + last_field.syntax().last_non_trivia_token()? } else { record_fields.l_curly_token()? }; @@ -114,7 +114,7 @@ fn missing_record_expr_field_fixes( let (comma, indent, postfix) = match after.kind() { syntax::SyntaxKind::L_CURLY => { - let newline = !after.next_token().is_some_and(|it| it.text().contains('\n')); + let newline = !after.trivia_after().any(|it| it.kind() == syntax::SyntaxKind::NEWLINE); ("", indent + 1, if newline { format!(",\n{indent}") } else { ",".into() }) } _ => (",", indent, String::new()), diff --git a/crates/ide-diagnostics/src/handlers/private_field.rs b/crates/ide-diagnostics/src/handlers/private_field.rs index 9515afed763f..fa8252e404fd 100644 --- a/crates/ide-diagnostics/src/handlers/private_field.rs +++ b/crates/ide-diagnostics/src/handlers/private_field.rs @@ -58,7 +58,9 @@ pub(crate) fn field_is_private_fixes( hir::FieldSource::Named(it) => { it.unsafe_token().or(it.name()?.ident_token())?.text_range() } - hir::FieldSource::Pos(it) => it.ty()?.syntax().text_range(), + hir::FieldSource::Pos(it) => { + it.ty()?.syntax().text_range_without_outer_trivia() + } }) }) .transpose()? diff --git a/crates/ide-diagnostics/src/handlers/remove_trailing_return.rs b/crates/ide-diagnostics/src/handlers/remove_trailing_return.rs index 7e431f3ff4a8..062397f8ecdb 100644 --- a/crates/ide-diagnostics/src/handlers/remove_trailing_return.rs +++ b/crates/ide-diagnostics/src/handlers/remove_trailing_return.rs @@ -23,7 +23,7 @@ pub(crate) fn remove_trailing_return( .syntax() .parent() .and_then(ast::ExprStmt::cast) - .map(|stmt| stmt.syntax().text_range()) + .map(|stmt| stmt.syntax().text_range_without_outer_trivia()) }); Some( Diagnostic::new( @@ -47,8 +47,9 @@ fn fixes(ctx: &DiagnosticsContext<'_, '_>, d: &RemoveTrailingReturn) -> Option, d: &RemoveUnnecessaryElse) -> Option< let then_replacement = format!("\n{then_indent}if {condition} {{{then_stmts}\n{then_indent}}}",); let replacement = format!("{{{then_replacement}{else_replacement}\n{base_indent}}}"); - (replacement, if_expr.syntax().text_range()) + (replacement, if_expr.syntax().text_range_without_outer_trivia()) } else { ( else_replacement, TextRange::new( - if_expr.then_branch()?.syntax().text_range().end(), - if_expr.syntax().text_range().end(), + if_expr.then_branch()?.syntax().text_range_without_outer_trivia().end(), + if_expr.syntax().text_range_without_outer_trivia().end(), ), ) }; diff --git a/crates/ide-diagnostics/src/handlers/replace_filter_map_next_with_find_map.rs b/crates/ide-diagnostics/src/handlers/replace_filter_map_next_with_find_map.rs index e67d86b8a212..15a5b30900d6 100644 --- a/crates/ide-diagnostics/src/handlers/replace_filter_map_next_with_find_map.rs +++ b/crates/ide-diagnostics/src/handlers/replace_filter_map_next_with_find_map.rs @@ -37,10 +37,12 @@ fn fixes( let filter_map_name_range = filter_map_call.name_ref()?.ident_token()?.text_range(); let filter_map_args = filter_map_call.arg_list()?; - let range_to_replace = - TextRange::new(filter_map_name_range.start(), next_expr.syntax().text_range().end()); - let replacement = format!("find_map{}", filter_map_args.syntax().text()); - let trigger_range = next_expr.syntax().text_range(); + let range_to_replace = TextRange::new( + filter_map_name_range.start(), + next_expr.syntax().text_range_without_outer_trivia().end(), + ); + let replacement = format!("find_map{}", filter_map_args.syntax().text_without_outer_trivia()); + let trigger_range = next_expr.syntax().text_range_without_outer_trivia(); let edit = TextEdit::replace(range_to_replace, replacement); diff --git a/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs b/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs index 1ffef25b5060..3117c0ce8943 100644 --- a/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs +++ b/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs @@ -26,7 +26,7 @@ pub(crate) fn trait_impl_missing_assoc_item( adjusted_display_range::( ctx, InFile { file_id: d.file_id, value: d.impl_ }, - &|impl_| impl_.trait_().map(|t| t.syntax().text_range()), + &|impl_| impl_.trait_().map(|t| t.syntax().text_range_without_outer_trivia()), ), ) .stable() diff --git a/crates/ide-diagnostics/src/handlers/trait_impl_redundant_assoc_item.rs b/crates/ide-diagnostics/src/handlers/trait_impl_redundant_assoc_item.rs index 9374688d0ec6..790163bb0d30 100644 --- a/crates/ide-diagnostics/src/handlers/trait_impl_redundant_assoc_item.rs +++ b/crates/ide-diagnostics/src/handlers/trait_impl_redundant_assoc_item.rs @@ -33,7 +33,10 @@ pub(crate) fn trait_impl_redundant_assoc_item( let function = id; ( format!("`fn {redundant_assoc_item_name}`"), - function.source(db).map(|it| it.syntax().text_range()).unwrap_or(default_range), + function + .source(db) + .map(|it| it.value.syntax().text_range_without_outer_trivia()) + .unwrap_or(default_range), format!("\n{};", function.display(db, ctx.display_target)), ) } @@ -41,7 +44,10 @@ pub(crate) fn trait_impl_redundant_assoc_item( let constant = id; ( format!("`const {redundant_assoc_item_name}`"), - constant.source(db).map(|it| it.syntax().text_range()).unwrap_or(default_range), + constant + .source(db) + .map(|it| it.value.syntax().text_range_without_outer_trivia()) + .unwrap_or(default_range), format!("\n{};", constant.display(db, ctx.display_target)), ) } @@ -49,7 +55,10 @@ pub(crate) fn trait_impl_redundant_assoc_item( let type_alias = id; ( format!("`type {redundant_assoc_item_name}`"), - type_alias.source(db).map(|it| it.syntax().text_range()).unwrap_or(default_range), + type_alias + .source(db) + .map(|it| it.value.syntax().text_range_without_outer_trivia()) + .unwrap_or(default_range), // FIXME cannot generate generic parameter and bounds format!("\ntype {};", type_alias.name(ctx.sema.db).display_no_db(ctx.edition)), ) @@ -124,7 +133,9 @@ fn find_insert_after( let impl_items_before_redundant = impl_def .assoc_item_list()? .assoc_items() - .take_while(|it| it.syntax().text_range().start() < redundant_range.start()) + .take_while(|it| { + it.syntax().text_range_without_outer_trivia().start() < redundant_range.start() + }) .filter_map(|it| name_of(&it)) .collect::>(); @@ -137,7 +148,7 @@ fn find_insert_after( }) }) .last() - .map(|it| it.syntax().text_range()); + .map(|it| it.syntax().text_range_without_outer_trivia()); return after_item.or_else(|| Some(trait_def.assoc_item_list()?.l_curly_token()?.text_range())); diff --git a/crates/ide-diagnostics/src/handlers/type_mismatch.rs b/crates/ide-diagnostics/src/handlers/type_mismatch.rs index 1e92a795e47a..80f419e9ff0d 100644 --- a/crates/ide-diagnostics/src/handlers/type_mismatch.rs +++ b/crates/ide-diagnostics/src/handlers/type_mismatch.rs @@ -132,7 +132,7 @@ fn add_or_fix_reference( let expr = ctx.sema.original_ast_node(expr)?; let expr_without_ref = RefExpr::cast(expr.syntax().clone())?.expr()?; - let pos = expr_without_ref.syntax().text_range().start(); + let pos = expr_without_ref.syntax().text_range_without_outer_trivia().start(); let edit = TextEdit::insert(pos, expected_mutability.as_keyword_for_ref().to_owned()); let source_change = SourceChange::from_text_edit(range.file_id, edit); acc.push(fix( @@ -344,7 +344,7 @@ fn remove_unnecessary_wrapper( "remove_unnecessary_wrapper", &name, builder.finish(), - call_expr.syntax().text_range(), + call_expr.syntax().text_range_without_outer_trivia(), )); Some(()) } diff --git a/crates/ide-diagnostics/src/handlers/unlinked_file.rs b/crates/ide-diagnostics/src/handlers/unlinked_file.rs index 376fc4fbdf78..a65528fc4302 100644 --- a/crates/ide-diagnostics/src/handlers/unlinked_file.rs +++ b/crates/ide-diagnostics/src/handlers/unlinked_file.rs @@ -267,7 +267,7 @@ fn make_fixes( match items.clone().skip_while(|item| !is_outline_mod(item)).take_while(is_outline_mod).last() { Some(last) => { cov_mark::hit!(unlinked_file_append_to_existing_mods); - let offset = last.syntax().text_range().end(); + let offset = last.syntax().text_range_without_outer_trivia().end(); let indent = IndentLevel::from_node(last.syntax()); mod_decl_builder.insert(offset, format!("\n{indent}{mod_decl}")); pub_mod_decl_builder.insert(offset, format!("\n{indent}{pub_mod_decl}")); @@ -278,7 +278,7 @@ fn make_fixes( match items.next() { Some(first) => { cov_mark::hit!(unlinked_file_prepend_before_first_item); - let offset = first.syntax().text_range().start(); + let offset = first.syntax().text_range_without_outer_trivia().start(); let indent = IndentLevel::from_node(first.syntax()); mod_decl_builder.insert(offset, format!("{mod_decl}\n\n{indent}")); pub_mod_decl_builder.insert(offset, format!("{pub_mod_decl}\n\n{indent}")); @@ -290,7 +290,9 @@ fn make_fixes( cov_mark::hit!(unlinked_file_empty_file); let mut indent = IndentLevel::from(0); let offset = match &source { - ModuleSource::SourceFile(it) => it.syntax().text_range().end(), + ModuleSource::SourceFile(it) => { + it.syntax().text_range_without_outer_trivia().end() + } ModuleSource::Module(it) => { indent = IndentLevel::from_node(it.syntax()) + 1; it.item_list()?.r_curly_token()?.text_range().start() diff --git a/crates/ide-diagnostics/src/handlers/unresolved_field.rs b/crates/ide-diagnostics/src/handlers/unresolved_field.rs index 26f5e45ea342..7b22cde71c3e 100644 --- a/crates/ide-diagnostics/src/handlers/unresolved_field.rs +++ b/crates/ide-diagnostics/src/handlers/unresolved_field.rs @@ -8,7 +8,7 @@ use ide_db::{ source_change::{SourceChange, SourceChangeBuilder}, }; use syntax::{ - AstNode, AstPtr, Direction, SyntaxKind, TextSize, algo, + AstNode, AstPtr, SyntaxKind, TextSize, ast::{self, FieldList, Name, Visibility, edit::IndentLevel, make}, }; use syntax::{ @@ -45,7 +45,7 @@ pub(crate) fn unresolved_field( _ => None, }? .syntax() - .text_range(), + .text_range_without_outer_trivia(), ) }), ) @@ -189,8 +189,7 @@ fn add_field_to_struct_fix( let field = make::record_field(visibility, field_name, suggested_type).indent(indent + 1); // A Unit Struct with no `;` is invalid syntax. We should not suggest this fix. - let semi_colon = - algo::skip_trivia_token(struct_syntax.value.last_token()?, Direction::Prev)?; + let semi_colon = struct_syntax.value.last_non_trivia_token()?; if semi_colon.kind() != SyntaxKind::SEMICOLON { return None; } @@ -225,15 +224,11 @@ fn record_field_layout( ) -> Option<(TextSize, String)> { let (offset, needs_comma, indent) = match field_list.fields().last() { Some(record_field) => { - let syntax = algo::skip_trivia_token(field_list.r_curly_token()?, Direction::Prev)?; + field_list.r_curly_token()?; let last_field_syntax = record_field.syntax(); let last_field_indent = IndentLevel::from_node(last_field_syntax); - ( - last_field_syntax.text_range().end(), - syntax.kind() != SyntaxKind::COMMA, - last_field_indent, - ) + (last_field_syntax.text_range_without_outer_trivia().end(), true, last_field_indent) } // Empty Struct. Add a field right before the closing brace None => { @@ -242,7 +237,8 @@ fn record_field_layout( (offset, false, indent) } }; - let trailing_new_line = if !field_list.syntax().text().contains_char('\n') { + let trailing_new_line = if !field_list.syntax().text_without_outer_trivia().contains_char('\n') + { format!("\n{}", field_list.indent_level()) } else { String::new() diff --git a/crates/ide-diagnostics/src/handlers/unresolved_method.rs b/crates/ide-diagnostics/src/handlers/unresolved_method.rs index 853e9d9f5692..ef60ef5f813c 100644 --- a/crates/ide-diagnostics/src/handlers/unresolved_method.rs +++ b/crates/ide-diagnostics/src/handlers/unresolved_method.rs @@ -42,7 +42,7 @@ pub(crate) fn unresolved_method( _ => None, }? .syntax() - .text_range(), + .text_range_without_outer_trivia(), ) }), ) @@ -122,7 +122,7 @@ fn assoc_func_fix( let expr: ast::Expr = expr_ptr.value.to_node(&root).left()?; let call = ast::MethodCallExpr::cast(expr.syntax().clone())?; - let range = InFile::new(expr_ptr.file_id, call.syntax().text_range()) + let range = InFile::new(expr_ptr.file_id, call.syntax().text_range_without_outer_trivia()) .original_node_file_range_rooted_opt(db)?; let receiver = call.receiver()?; diff --git a/crates/ide-diagnostics/src/handlers/unresolved_module.rs b/crates/ide-diagnostics/src/handlers/unresolved_module.rs index d5f2697bd218..aea399464796 100644 --- a/crates/ide-diagnostics/src/handlers/unresolved_module.rs +++ b/crates/ide-diagnostics/src/handlers/unresolved_module.rs @@ -49,7 +49,7 @@ fn fixes(ctx: &DiagnosticsContext<'_, '_>, d: &hir::UnresolvedModule) -> Option< initial_contents: "".to_owned(), } .into(), - unresolved_module.syntax().text_range(), + unresolved_module.syntax().text_range_without_outer_trivia(), ) }) .collect(), diff --git a/crates/ide-diagnostics/src/handlers/useless_braces.rs b/crates/ide-diagnostics/src/handlers/useless_braces.rs index e0ea4b337387..b2cff35e0614 100644 --- a/crates/ide-diagnostics/src/handlers/useless_braces.rs +++ b/crates/ide-diagnostics/src/handlers/useless_braces.rs @@ -29,8 +29,8 @@ pub(crate) fn useless_braces( return Some(()); } - let use_range = use_tree_list.syntax().text_range(); - let to_replace = single_use_tree.syntax().text().to_string(); + let use_range = use_tree_list.syntax().text_range_without_outer_trivia(); + let to_replace = single_use_tree.syntax().text_without_outer_trivia().to_string(); let mut edit_builder = TextEdit::builder(); edit_builder.delete(use_range); edit_builder.insert(use_range.start(), to_replace); diff --git a/crates/ide-diagnostics/src/lib.rs b/crates/ide-diagnostics/src/lib.rs index 4e941f8da070..74fc34d94401 100644 --- a/crates/ide-diagnostics/src/lib.rs +++ b/crates/ide-diagnostics/src/lib.rs @@ -856,8 +856,8 @@ fn adjusted_display_range( ) -> FileRange { let source_file = ctx.sema.parse_or_expand(diag_ptr.file_id); let node = diag_ptr.value.to_node(&source_file); - let hir::FileRange { file_id, range } = diag_ptr - .with_value(adj(node).unwrap_or_else(|| diag_ptr.value.text_range())) - .original_node_file_range_rooted(ctx.sema.db); + let own = node.syntax().text_range_without_outer_trivia(); + let hir::FileRange { file_id, range } = + diag_ptr.with_value(adj(node).unwrap_or(own)).original_node_file_range_rooted(ctx.sema.db); ide_db::FileRange { file_id: file_id.file_id(ctx.sema.db), range } } diff --git a/crates/ide-ssr/src/fragments.rs b/crates/ide-ssr/src/fragments.rs index bb5234ed8f3c..10a56b22cd03 100644 --- a/crates/ide-ssr/src/fragments.rs +++ b/crates/ide-ssr/src/fragments.rs @@ -36,12 +36,12 @@ pub(crate) fn stmt(s: &str) -> Result { let node = ast::Stmt::cast(node).ok_or(())?; if !s.ends_with(';') && node.to_string().ends_with(';') - && let Some(token) = node.syntax().last_token() + && let Some(token) = node.syntax().last_non_trivia_token() { editor.delete(token); } let node = editor.finish().new_root().clone(); - if node.to_string() != s { + if node.text_without_outer_trivia() != s { return Err(()); } Ok(node) @@ -56,7 +56,7 @@ fn fragment(template: &str, s: &str) -> Result { } let node = parse.tree().syntax().descendants().find_map(T::cast).ok_or(())?; let (_, node) = SyntaxEditor::new(node.syntax().clone()); - if node.text() != s { + if node.text_without_outer_trivia() != s { return Err(()); } Ok(node) diff --git a/crates/ide-ssr/src/lib.rs b/crates/ide-ssr/src/lib.rs index a614d71c1f29..f2a16f8d11dc 100644 --- a/crates/ide-ssr/src/lib.rs +++ b/crates/ide-ssr/src/lib.rs @@ -348,7 +348,7 @@ impl SsrMatches { impl Match { pub fn matched_text(&self) -> String { - self.matched_node.text().to_string() + self.matched_node.text_without_outer_trivia().to_string() } } diff --git a/crates/ide-ssr/src/matching.rs b/crates/ide-ssr/src/matching.rs index c87a10d8e85b..ccb78dc92ac9 100644 --- a/crates/ide-ssr/src/matching.rs +++ b/crates/ide-ssr/src/matching.rs @@ -188,6 +188,11 @@ impl<'db, 'sema> Matcher<'db, 'sema> { placeholder.ident.clone(), PlaceholderMatch::from_range(original_range), ); + let leading = + code.first_non_trivia_token().into_iter().flat_map(|it| it.leading_trivia()); + let trailing = + code.last_non_trivia_token().into_iter().flat_map(|it| it.trailing_trivia()); + phase.record_ignored_comments(leading.chain(trailing)); } return Ok(()); } @@ -269,11 +274,7 @@ impl<'db, 'sema> Matcher<'db, 'sema> { pattern: &mut Peekable, code: &syntax::SyntaxToken, ) -> Result<(), MatchFailed> { - phase.record_ignored_comments(code); - // Ignore whitespace and comments. - if code.kind().is_trivia() { - return Ok(()); - } + phase.record_ignored_comments(code.leading_trivia().chain(code.trailing_trivia())); if let Some(SyntaxElement::Token(p)) = pattern.peek() { // If the code has a comma and the pattern is about to close something, then accept the // comma without advancing the pattern. i.e. ignore trailing commas. @@ -384,9 +385,15 @@ impl<'db, 'sema> Matcher<'db, 'sema> { match (pattern, code) { (Some(p), Some(c)) => self.attempt_match_node(phase, p.syntax(), c.syntax()), (None, None) => Ok(()), - (Some(p), None) => fail_match!("Pattern `{}` had nothing to match", p.syntax().text()), + (Some(p), None) => fail_match!( + "Pattern `{}` had nothing to match", + p.syntax().text_without_outer_trivia() + ), (None, Some(c)) => { - fail_match!("Nothing in pattern to match code `{}`", c.syntax().text()) + fail_match!( + "Nothing in pattern to match code `{}`", + c.syntax().text_without_outer_trivia() + ) } } } @@ -455,7 +462,7 @@ impl<'db, 'sema> Matcher<'db, 'sema> { .peek() .and_then(|p| match p { SyntaxElement::Token(t) => Some(t.clone()), - SyntaxElement::Node(n) => n.first_token(), + SyntaxElement::Node(n) => n.first_non_trivia_token(), }) .map(|p| p.text().to_owned()); let first_matched_token = child.clone(); @@ -465,13 +472,13 @@ impl<'db, 'sema> Matcher<'db, 'sema> { for next in &mut children { match &next { SyntaxElement::Token(t) => { - if Some(t.to_string()) == next_pattern_token { + if Some(t.text().to_owned()) == next_pattern_token { pattern.next(); break; } } SyntaxElement::Node(n) => { - if let Some(first_token) = n.first_token() + if let Some(first_token) = n.first_non_trivia_token() && Some(first_token.text()) == next_pattern_token.as_deref() && let Some(SyntaxElement::Node(p)) = pattern.next() { @@ -616,7 +623,10 @@ impl<'db, 'sema> Matcher<'db, 'sema> { .sema .type_of_expr(expr) .ok_or_else(|| { - match_error!("Failed to get receiver type for `{}`", expr.syntax().text()) + match_error!( + "Failed to get receiver type for `{}`", + expr.syntax().text_without_outer_trivia() + ) })? .original; let krate = self.sema.scope(expr.syntax()).map(|it| it.krate()).unwrap_or_else(|| { @@ -678,24 +688,19 @@ impl Match { impl Phase<'_> { fn next_non_trivial(&mut self, code_it: &mut SyntaxElementChildren) -> Option { - loop { - let c = code_it.next(); - if let Some(SyntaxElement::Token(t)) = &c { - self.record_ignored_comments(t); - if t.kind().is_trivia() { - continue; - } - } - return c; + let c = code_it.next(); + if let Some(SyntaxElement::Token(t)) = &c { + self.record_ignored_comments(t.leading_trivia().chain(t.trailing_trivia())); } + c } - fn record_ignored_comments(&mut self, token: &SyntaxToken) { - if token.kind() == SyntaxKind::COMMENT - && let Phase::Second(match_out) = self - && let Some(comment) = ast::Comment::cast(token.clone()) - { - match_out.ignored_comments.push(comment); + fn record_ignored_comments(&mut self, trivia: impl Iterator) { + let Phase::Second(match_out) = self else { return }; + for comment in trivia.filter_map(ast::Comment::cast) { + if !match_out.ignored_comments.contains(&comment) { + match_out.ignored_comments.push(comment); + } } } } @@ -778,7 +783,7 @@ impl Iterator for PatternIterator { type Item = SyntaxElement; fn next(&mut self) -> Option { - self.iter.find(|element| !element.kind().is_trivia()) + self.iter.next() } } diff --git a/crates/ide-ssr/src/replacing.rs b/crates/ide-ssr/src/replacing.rs index 6bf4e72f200b..170daa0bf185 100644 --- a/crates/ide-ssr/src/replacing.rs +++ b/crates/ide-ssr/src/replacing.rs @@ -127,6 +127,12 @@ impl<'db> ReplacementRenderer<'_, 'db> { } fn render_token(&mut self, token: &SyntaxToken) { + self.out.extend(token.leading_trivia().map(|it| it.text().to_owned())); + self.render_token_text(token); + self.out.extend(token.trailing_trivia().map(|it| it.text().to_owned())); + } + + fn render_token_text(&mut self, token: &SyntaxToken) { if let Some(placeholder) = self.rule.get_placeholder(token) { if let Some(placeholder_value) = self.match_info.placeholder_values.get(&placeholder.ident) @@ -210,7 +216,7 @@ impl<'db> ReplacementRenderer<'_, 'db> { } fn remove_node_ranges(&mut self, node: SyntaxNode) { - self.placeholder_tokens_by_range.remove(&node.text_range()); + self.placeholder_tokens_by_range.remove(&node.text_range_without_outer_trivia()); for child in node.children() { self.remove_node_ranges(child); } diff --git a/crates/ide/src/annotations.rs b/crates/ide/src/annotations.rs index 884bc111caea..45935538aafa 100644 --- a/crates/ide/src/annotations.rs +++ b/crates/ide/src/annotations.rs @@ -153,14 +153,16 @@ pub(crate) fn annotations( node: InFile, source_file_id: FileId, ) -> Option<(TextRange, Option)> { - if let Some(name) = node.value.name().map(|name| name.syntax().text_range()) { + if let Some(name) = + node.value.name().map(|name| name.syntax().text_range_without_outer_trivia()) + { // if we have a name, try mapping that out of the macro expansion as we can put the // annotation on that name token // See `test_no_annotations_macro_struct_def` vs `test_annotations_macro_struct_def_call_site` let res = navigation_target::orig_range_with_focus_r( db, node.file_id, - node.value.syntax().text_range(), + node.value.syntax().text_range_without_outer_trivia(), Some(name), ); if res.call_site.0.file_id == source_file_id @@ -173,8 +175,8 @@ pub(crate) fn annotations( let InRealFile { file_id, value } = node.original_ast_node_rooted(db)?; if file_id.file_id(db) == source_file_id { Some(( - value.syntax().text_range(), - value.name().map(|name| name.syntax().text_range()), + value.syntax().text_range_without_outer_trivia(), + value.name().map(|name| name.syntax().text_range_without_outer_trivia()), )) } else { None diff --git a/crates/ide/src/annotations/fn_references.rs b/crates/ide/src/annotations/fn_references.rs index b43a23e69f37..b6d5e9116600 100644 --- a/crates/ide/src/annotations/fn_references.rs +++ b/crates/ide/src/annotations/fn_references.rs @@ -23,8 +23,8 @@ fn method_range(item: SyntaxNode) -> Option<(TextRange, Option)> { None } else { Some(( - fn_def.syntax().text_range(), - fn_def.name().map(|name| name.syntax().text_range()), + fn_def.syntax().text_range_without_outer_trivia(), + fn_def.name().map(|name| name.syntax().text_range_without_outer_trivia()), )) } }) diff --git a/crates/ide/src/doc_links.rs b/crates/ide/src/doc_links.rs index 94e7db9390bc..d2fabf6dd66e 100644 --- a/crates/ide/src/doc_links.rs +++ b/crates/ide/src/doc_links.rs @@ -154,7 +154,6 @@ pub(crate) fn external_docs( let token = pick_best_token(file.token_at_offset(offset), |kind| match kind { IDENT | INT_NUMBER | T![self] => 3, T!['('] | T![')'] => 2, - kind if kind.is_trivia() => 0, _ => 1, })?; let token = sema.descend_into_macros_single_exact(token); diff --git a/crates/ide/src/expand_macro.rs b/crates/ide/src/expand_macro.rs index 6c34b97a39a3..6ceca7fb110b 100644 --- a/crates/ide/src/expand_macro.rs +++ b/crates/ide/src/expand_macro.rs @@ -160,7 +160,10 @@ fn expand_macro_recur( sema.hir_file_for(&expanded).macro_file().expect("expansion must produce a macro file"); let expansion_span_map = file_id.expansion_span_map(sema.db); result_span_map.merge( - TextRange::at(offset_in_original_node, macro_call.syntax().text_range().len()), + TextRange::at( + offset_in_original_node, + macro_call.syntax().text_range_without_outer_trivia().len(), + ), expanded.text_range().len(), expansion_span_map, ); @@ -185,13 +188,14 @@ fn expand( error, result_span_map, TextSize::new( - (offset_in_original_node + (u32::from(child.syntax().text_range().start()) as i32)) + (offset_in_original_node + + (u32::from(child.syntax().text_range_without_outer_trivia().start()) as i32)) as u32, ), ) { offset_in_original_node = offset_in_original_node + (u32::from(new_node.text_range().len()) as i32) - - (u32::from(child.syntax().text_range().len()) as i32); + - (u32::from(child.syntax().text_range_without_outer_trivia().len()) as i32); // check if the whole original syntax is replaced if expanded == *child.syntax() { return new_node; diff --git a/crates/ide/src/extend_selection.rs b/crates/ide/src/extend_selection.rs index 079f8426cf5a..37df63dcbf18 100644 --- a/crates/ide/src/extend_selection.rs +++ b/crates/ide/src/extend_selection.rs @@ -3,10 +3,9 @@ use std::iter::successors; use hir::Semantics; use ide_db::RootDatabase; use syntax::{ - Direction, NodeOrToken, + Direction, NodeOrToken, SyntaxElement, SyntaxKind::{self, *}, - SyntaxNode, SyntaxToken, T, TextRange, TextSize, TokenAtOffset, - algo::{self, skip_trivia_token}, + SyntaxNode, SyntaxToken, T, TextRange, TextSize, TokenAtOffset, algo, ast::{self, AstNode, AstToken}, }; @@ -60,8 +59,9 @@ fn try_extend_selection( if range.is_empty() { let offset = range.start(); let mut leaves = root.token_at_offset(offset); - if leaves.clone().all(|it| it.kind() == WHITESPACE) { - return Some(extend_ws(root, leaves.next()?, offset)); + if leaves.clone().all(|it| matches!(it.kind(), WHITESPACE | NEWLINE)) { + let run = syntax::algo::blank_run(&leaves.next()?); + return Some(extend_ws(root, run.after, run.range, offset)); } let leaf_range = match leaves { TokenAtOffset::None => return None, @@ -82,8 +82,8 @@ fn try_extend_selection( if token.text_range() != range { return Some(token.text_range()); } - if let Some(comment) = ast::AnyComment::cast(token.clone()) - && let Some(range) = extend_comments(comment) + if ast::AnyComment::can_cast(token.kind()) + && let Some(range) = extend_comments(&token) { return Some(range); } @@ -100,8 +100,8 @@ fn try_extend_selection( return Some(range); } - if node.text_range() != range { - return Some(node.text_range()); + if node.text_range_without_outer_trivia() != range { + return Some(node.text_range_without_outer_trivia()); } let node = shallowest_node(&node); @@ -112,7 +112,7 @@ fn try_extend_selection( return Some(range); } - node.parent().map(|it| it.text_range()) + node.parent().map(|it| it.text_range_without_outer_trivia()) } fn extend_tokens_from_range( @@ -122,18 +122,20 @@ fn extend_tokens_from_range( ) -> Option { let src = macro_call.syntax().covering_element(original_range); let (first_token, last_token) = match src { - NodeOrToken::Node(it) => (it.first_token()?, it.last_token()?), + NodeOrToken::Node(it) => (it.first_non_trivia_token()?, it.last_non_trivia_token()?), NodeOrToken::Token(it) => (it.clone(), it), }; - let mut first_token = skip_trivia_token(first_token, Direction::Next)?; - let mut last_token = skip_trivia_token(last_token, Direction::Prev)?; + let mut first_token = + if !first_token.is_trivia() { first_token } else { first_token.next_non_trivia_token()? }; + let mut last_token = + if !last_token.is_trivia() { last_token } else { last_token.prev_non_trivia_token()? }; while !original_range.contains_range(first_token.text_range()) { - first_token = skip_trivia_token(first_token.next_token()?, Direction::Next)?; + first_token = first_token.next_non_trivia_token()?; } while !original_range.contains_range(last_token.text_range()) { - last_token = skip_trivia_token(last_token.prev_token()?, Direction::Prev)?; + last_token = last_token.prev_non_trivia_token()?; } // compute original mapped token range @@ -143,7 +145,9 @@ fn extend_tokens_from_range( let mut lca = algo::least_common_ancestor(&fst_expanded.parent()?, &lst_expanded.parent()?)?; lca = shallowest_node(&lca); - if lca.first_token() == Some(fst_expanded) && lca.last_token() == Some(lst_expanded) { + if lca.first_non_trivia_token() == Some(fst_expanded) + && lca.last_non_trivia_token() == Some(lst_expanded) + { lca = lca.parent()?; } lca @@ -163,19 +167,13 @@ fn extend_tokens_from_range( }; // Find the first and last text range under expanded parent - let first = successors(Some(first_token), |token| { - let token = token.prev_token()?; - skip_trivia_token(token, Direction::Prev) - }) - .take_while(validate()) - .last()?; - - let last = successors(Some(last_token), |token| { - let token = token.next_token()?; - skip_trivia_token(token, Direction::Next) - }) - .take_while(validate()) - .last()?; + let first = successors(Some(first_token), |token| token.prev_non_trivia_token()) + .take_while(validate()) + .last()?; + + let last = successors(Some(last_token), |token| token.next_non_trivia_token()) + .take_while(validate()) + .last()?; let range = first.text_range().cover(last.text_range()); if range.contains_range(original_range) && original_range != range { Some(range) } else { None } @@ -183,7 +181,12 @@ fn extend_tokens_from_range( /// Find the shallowest node with same range, which allows us to traverse siblings. fn shallowest_node(node: &SyntaxNode) -> SyntaxNode { - node.ancestors().take_while(|n| n.text_range() == node.text_range()).last().unwrap() + node.ancestors() + .take_while(|n| { + n.text_range_without_outer_trivia() == node.text_range_without_outer_trivia() + }) + .last() + .unwrap() } fn extend_single_word_in_comment_or_string( @@ -215,35 +218,53 @@ fn extend_single_word_in_comment_or_string( if range.is_empty() { None } else { Some(range + leaf.text_range().start()) } } -fn extend_ws(root: &SyntaxNode, ws: SyntaxToken, offset: TextSize) -> TextRange { - let ws_text = ws.text(); - let suffix = TextRange::new(offset, ws.text_range().end()) - ws.text_range().start(); - let prefix = TextRange::new(ws.text_range().start(), offset) - ws.text_range().start(); +fn extend_ws( + root: &SyntaxNode, + after: Option, + ws: TextRange, + offset: TextSize, +) -> TextRange { + let ws_text = root.text().slice(ws - root.text_range().start()).to_string(); + let ws_text = ws_text.as_str(); + let suffix = TextRange::new(offset, ws.end()) - ws.start(); + let prefix = TextRange::new(ws.start(), offset) - ws.start(); let ws_suffix = &ws_text[suffix]; let ws_prefix = &ws_text[prefix]; if ws_text.contains('\n') && !ws_suffix.contains('\n') - && let Some(node) = ws.next_sibling_or_token() + && let Some(after) = after { + let node: SyntaxElement = match after.index() { + None => after.into(), + Some(_) => { + let owner = after.prev_token().and_then(|trivia_token| trivia_token.owning_node()); + after + .parent_ancestors() + .take_while(|it| Some(it) != owner.as_ref()) + .last() + .map_or(after.into(), Into::into) + } + }; let start = match ws_prefix.rfind('\n') { - Some(idx) => ws.text_range().start() + TextSize::from((idx + 1) as u32), - None => node.text_range().start(), + Some(idx) => ws.start() + TextSize::from((idx + 1) as u32), + None => node.text_range_without_outer_trivia().start(), }; - let end = if root.text().char_at(node.text_range().end()) == Some('\n') { - node.text_range().end() + TextSize::of('\n') + let end = if root.text().char_at(node.text_range_without_outer_trivia().end()) == Some('\n') + { + node.text_range_without_outer_trivia().end() + TextSize::of('\n') } else { - node.text_range().end() + node.text_range_without_outer_trivia().end() }; return TextRange::new(start, end); } - ws.text_range() + ws } fn pick_best(l: SyntaxToken, r: SyntaxToken) -> SyntaxToken { return if priority(&r) > priority(&l) { r } else { l }; fn priority(n: &SyntaxToken) -> usize { match n.kind() { - WHITESPACE => 0, + WHITESPACE | NEWLINE => 0, IDENT | T![self] | T![super] | T![crate] | T![Self] | LIFETIME_IDENT => 2, _ => 1, } @@ -252,21 +273,13 @@ fn pick_best(l: SyntaxToken, r: SyntaxToken) -> SyntaxToken { /// Extend list item selection to include nearby delimiter and whitespace. fn extend_list_item(node: &SyntaxNode) -> Option { - fn is_single_line_ws(node: &SyntaxToken) -> bool { - node.kind() == WHITESPACE && !node.text().contains('\n') - } - fn nearby_delimiter( delimiter_kind: SyntaxKind, node: &SyntaxNode, dir: Direction, ) -> Option { node.siblings_with_tokens(dir) - .skip(1) - .find(|node| match node { - NodeOrToken::Node(_) => true, - NodeOrToken::Token(it) => !is_single_line_ws(it), - }) + .nth(1) .and_then(|it| it.into_token()) .filter(|node| node.kind() == delimiter_kind) } @@ -278,45 +291,35 @@ fn extend_list_item(node: &SyntaxNode) -> Option { if let Some(delimiter_node) = nearby_delimiter(delimiter, node, Direction::Next) { // Include any following whitespace when delimiter is after list item. - let final_node = delimiter_node - .next_sibling_or_token() - .and_then(|it| it.into_token()) - .filter(is_single_line_ws) - .unwrap_or(delimiter_node); + let mut end = delimiter_node.text_range().end(); + for trivia_token in delimiter_node.trailing_trivia() { + if trivia_token.kind() != WHITESPACE { + break; + } + end = trivia_token.text_range().end(); + } - return Some(TextRange::new(node.text_range().start(), final_node.text_range().end())); + return Some(TextRange::new(node.text_range_without_outer_trivia().start(), end)); } if let Some(delimiter_node) = nearby_delimiter(delimiter, node, Direction::Prev) { - return Some(TextRange::new(delimiter_node.text_range().start(), node.text_range().end())); + return Some(TextRange::new( + delimiter_node.text_range().start(), + node.text_range_without_outer_trivia().end(), + )); } None } -fn extend_comments(comment: ast::AnyComment) -> Option { - let prev = adj_comments(&comment, Direction::Prev); - let next = adj_comments(&comment, Direction::Next); - if prev != next { - Some(TextRange::new(prev.syntax().text_range().start(), next.syntax().text_range().end())) - } else { - None - } -} - -fn adj_comments(comment: &ast::AnyComment, dir: Direction) -> ast::AnyComment { - let mut res = comment.clone(); - for element in comment.syntax().siblings_with_tokens(dir) { - let token = match element.as_token() { - None => break, - Some(token) => token, - }; - if let Some(c) = ast::AnyComment::cast(token.clone()) { - res = c - } else if token.kind() != WHITESPACE || token.text().contains("\n\n") { - break; - } - } - res +fn extend_comments(comment: &SyntaxToken) -> Option { + let prev = + successors(Some(comment.clone()), |it| syntax::algo::adjacent_comment(it, Direction::Prev)) + .last()?; + let next = + successors(Some(comment.clone()), |it| syntax::algo::adjacent_comment(it, Direction::Next)) + .last()?; + let range = TextRange::new(prev.text_range().start(), next.text_range().end()); + (range != comment.text_range()).then_some(range) } #[cfg(test)] diff --git a/crates/ide/src/file_structure.rs b/crates/ide/src/file_structure.rs index 1a85342dc905..b57db5cc0906 100644 --- a/crates/ide/src/file_structure.rs +++ b/crates/ide/src/file_structure.rs @@ -46,11 +46,33 @@ pub(crate) fn file_structure( config: &FileStructureConfig, ) -> Vec { let mut res = Vec::new(); - let mut stack = Vec::new(); + let mut stack: Vec = Vec::new(); + + let regions = |trivia: &mut dyn Iterator, + owner: Option, + res: &mut Vec, + parent: Option| { + for trivia_token in trivia { + if let Some(mut symbol) = structure_token(trivia_token.clone()) + && trivia_token.owning_node() == owner + { + symbol.parent = parent; + res.push(symbol); + } + } + }; for event in file.syntax().preorder_with_tokens() { match event { WalkEvent::Enter(NodeOrToken::Node(node)) => { + if let Some(token) = node.first_non_trivia_token() { + regions( + &mut token.leading_trivia(), + node.parent(), + &mut res, + stack.last().copied(), + ); + } if let Some(mut symbol) = structure_node(&node, config) { symbol.parent = stack.last().copied(); stack.push(res.len()); @@ -61,19 +83,24 @@ pub(crate) fn file_structure( if structure_node(&node, config).is_some() { stack.pop().unwrap(); } - } - WalkEvent::Enter(NodeOrToken::Token(token)) => { - if let Some(mut symbol) = structure_token(token) { - symbol.parent = stack.last().copied(); - stack.push(res.len()); - res.push(symbol); + if let Some(token) = node.last_non_trivia_token() { + regions( + &mut token.trailing_trivia(), + node.parent(), + &mut res, + stack.last().copied(), + ); } } - WalkEvent::Leave(NodeOrToken::Token(token)) => { - if structure_token(token).is_some() { - stack.pop().unwrap(); - } + WalkEvent::Enter(NodeOrToken::Token(token)) => { + regions( + &mut token.leading_trivia().chain(token.trailing_trivia()), + token.parent(), + &mut res, + stack.last().copied(), + ); } + WalkEvent::Leave(NodeOrToken::Token(_)) => (), } } res @@ -107,8 +134,8 @@ fn structure_node(node: &SyntaxNode, config: &FileStructureConfig) -> Option Option Option format!("impl {}", target_type.syntax().text()), + None => format!("impl {}", target_type.syntax().text_without_outer_trivia()), Some(t) => { format!("impl {}{} for {}", - it.excl_token().map(|x| x.to_string()).unwrap_or_default(), - t.syntax().text(), - target_type.syntax().text(), + it.excl_token().map(|x| x.text().to_owned()).unwrap_or_default(), + t.syntax().text_without_outer_trivia(), + target_type.syntax().text_without_outer_trivia(), ) } }; @@ -185,8 +209,8 @@ fn structure_node(node: &SyntaxNode, config: &FileStructureConfig) -> Option Option Option Vec // Fold items that span multiple lines if let Some((kind, collapsed_text)) = fold_kind(element.clone(), add_collapsed_text) { let is_multiline = match &element { - NodeOrToken::Node(node) => node.text().contains_char('\n'), + NodeOrToken::Node(node) => node.text_without_outer_trivia().contains_char('\n'), NodeOrToken::Token(token) => token.text().contains('\n'), }; @@ -80,7 +80,9 @@ pub(crate) fn folding_ranges(file: &SourceFile, add_collapsed_text: bool) -> Vec { if !fn_ .param_list() - .map(|param_list| param_list.syntax().text().contains_char('\n')) + .map(|param_list| { + param_list.syntax().text_without_outer_trivia().contains_char('\n') + }) .unwrap_or_default() { continue; @@ -91,16 +93,20 @@ pub(crate) fn folding_ranges(file: &SourceFile, add_collapsed_text: bool) -> Vec let fn_start = fn_ .fn_token() .map(|token| token.text_range().start()) - .unwrap_or(node.text_range().start()); + .unwrap_or(node.text_range_without_outer_trivia().start()); res.push(Fold::new( - TextRange::new(fn_start, body.syntax().text_range().end()), + TextRange::new( + fn_start, + body.syntax().text_range_without_outer_trivia().end(), + ), FoldKind::Function, )); continue; } } - let fold = Fold::new(element.text_range(), kind).with_text(collapsed_text); + let fold = Fold::new(element.text_range_without_outer_trivia(), kind) + .with_text(collapsed_text); res.push(fold); continue; } @@ -108,8 +114,12 @@ pub(crate) fn folding_ranges(file: &SourceFile, add_collapsed_text: bool) -> Vec match element { NodeOrToken::Token(token) => { - // Fold groups of comments - if let Some(comment) = ast::AnyComment::cast(token) { + let trivia = token + .leading_trivia() + .chain(std::iter::once(token.clone())) + .chain(token.trailing_trivia()); + for trivia_token in trivia { + let Some(comment) = ast::AnyComment::cast(trivia_token) else { continue }; if visited_comments.contains(&comment) { continue; } @@ -123,6 +133,10 @@ pub(crate) fn folding_ranges(file: &SourceFile, add_collapsed_text: bool) -> Vec FoldKind::Region, )); } + } else if !comment.kind().shape.is_line() { + if comment.syntax().text().contains('\n') { + res.push(Fold::new(comment.syntax().text_range(), FoldKind::Comment)); + } } else if let Some(range) = contiguous_range_for_comment(comment, &mut visited_comments) { @@ -200,7 +214,6 @@ fn fold_kind( } match element.kind() { - COMMENT | INNER_DOC_COMMENT | OUTER_DOC_COMMENT => Some(FoldKind::Comment), ARG_LIST | PARAM_LIST | GENERIC_ARG_LIST | GENERIC_PARAM_LIST => Some(FoldKind::ArgList), ARRAY_EXPR => Some(FoldKind::Array), RET_TYPE => Some(FoldKind::ReturnType), @@ -258,9 +271,10 @@ fn collapsed_stmt(stmt: ast::Stmt) -> Option { let Some(eq_token) = let_stmt.eq_token() else { break 'blk None; }; - let eq_token_offset = - eq_token.text_range().end() - let_stmt.syntax().text_range().start(); - let text_until_eq_token = let_stmt.syntax().text().slice(..eq_token_offset); + let eq_token_offset = eq_token.text_range().end() + - let_stmt.syntax().text_range_without_outer_trivia().start(); + let text_until_eq_token = + let_stmt.syntax().text_without_outer_trivia().slice(..eq_token_offset); if text_until_eq_token.contains_char('\n') { break 'blk None; } @@ -315,11 +329,7 @@ fn collapse_expr(expr: ast::Expr) -> Option { } } } - syntax::WalkEvent::Enter(NodeOrToken::Token(token)) => { - if !token.kind().is_trivia() { - text.push_str(token.text()); - } - } + syntax::WalkEvent::Enter(NodeOrToken::Token(token)) => text.push_str(token.text()), syntax::WalkEvent::Leave(_) => {} } @@ -347,19 +357,18 @@ where let (mut last, mut last_vis) = (first.clone(), first.visibility()); for element in first.syntax().siblings_with_tokens(Direction::Next) { let node = match element { - NodeOrToken::Token(token) => { - if let Some(ws) = ast::Whitespace::cast(token) - && !ws.spans_multiple_lines() - { - // Ignore whitespace without blank lines - continue; - } - // There is a blank line or another token, which means that the - // group ends here - break; - } + NodeOrToken::Token(_) => break, NodeOrToken::Node(node) => node, }; + if node != *first.syntax() { + let gap = node.trivia_before().map(|it| it.text().to_owned()).collect::(); + let mut lines = gap.split('\n'); + lines.next(); + lines.next_back(); + if lines.any(|line| line.trim().is_empty()) { + break; + } + } if let Some(next) = N::cast(node) { let next_vis = next.visibility(); @@ -375,7 +384,10 @@ where } if first != last { - Some(TextRange::new(first.syntax().text_range().start(), last.syntax().text_range().end())) + Some(TextRange::new( + first.syntax().text_range_without_outer_trivia().start(), + last.syntax().text_range_without_outer_trivia().end(), + )) } else { // The group consists of only one element, therefore it cannot be folded None @@ -403,14 +415,7 @@ fn contiguous_range_for_comment( } let mut last = first.clone(); - let next_comments = std::iter::successors(Some(first.syntax().clone()), |it| it.next_token()); - for token in next_comments { - if let Some(ws) = ast::Whitespace::cast(token.clone()) - && !ws.spans_multiple_lines() - { - // Ignore whitespace without blank lines - continue; - } + while let Some(token) = syntax::algo::adjacent_comment(last.syntax(), Direction::Next) { if let Some(c) = ast::AnyComment::cast(token) && c.kind() == group_kind { @@ -439,8 +444,8 @@ fn contiguous_range_for_comment( fn fold_range_for_multiline_match_arm(match_arm: ast::MatchArm) -> Option { if fold_kind(match_arm.expr()?.syntax().syntax_element(), false).is_some() { None - } else if match_arm.expr()?.syntax().text().contains_char('\n') { - Some(match_arm.expr()?.syntax().text_range()) + } else if match_arm.expr()?.syntax().text_without_outer_trivia().contains_char('\n') { + Some(match_arm.expr()?.syntax().text_range_without_outer_trivia()) } else { None } diff --git a/crates/ide/src/goto_definition.rs b/crates/ide/src/goto_definition.rs index bb317525dd5d..96331410bfe5 100644 --- a/crates/ide/src/goto_definition.rs +++ b/crates/ide/src/goto_definition.rs @@ -71,14 +71,12 @@ pub(crate) fn goto_definition( | T![super] | T![crate] | T![Self] - | COMMENT | INNER_DOC_COMMENT | OUTER_DOC_COMMENT => 4, // index and prefix ops T!['['] | T![']'] | T![?] | T![*] | T![-] | T![!] => 3, kind if kind.is_keyword(edition) => 2, T!['('] | T![')'] => 2, - kind if kind.is_trivia() => 0, _ => 1, })?; if let Some(doc_comment) = token_as_doc_comment(&original_token) { @@ -643,7 +641,9 @@ fn nav_for_break_points( ast::Expr::WhileExpr(while_) => while_.while_token()?.text_range(), ast::Expr::ForExpr(for_) => for_.for_token()?.text_range(), // We guarantee that the label exists - ast::Expr::BlockExpr(blk) => blk.label().unwrap().syntax().text_range(), + ast::Expr::BlockExpr(blk) => { + blk.label().unwrap().syntax().text_range_without_outer_trivia() + } _ => return None, }; let nav = expr_to_nav(db, expr_in_file, Some(focus_range)); @@ -666,7 +666,7 @@ fn expr_to_nav( ) -> UpmappingResult { let kind = SymbolKind::Label; - let value_range = value.syntax().text_range(); + let value_range = value.syntax().text_range_without_outer_trivia(); let navs = navigation_target::orig_range_with_focus_r(db, file_id, value_range, focus_range); navs.map(|(hir::FileRangeWrapper { file_id, range }, focus_range)| { NavigationTarget::from_syntax( diff --git a/crates/ide/src/goto_type_definition.rs b/crates/ide/src/goto_type_definition.rs index 9de956be5ed1..a101048dd14e 100644 --- a/crates/ide/src/goto_type_definition.rs +++ b/crates/ide/src/goto_type_definition.rs @@ -23,7 +23,6 @@ pub(crate) fn goto_type_definition( let token: SyntaxToken = pick_best_token(file.syntax().token_at_offset(offset), |kind| match kind { IDENT | INT_NUMBER | T![self] => 3, - kind if kind.is_trivia() => 0, T![;] => 1, _ => 2, })?; diff --git a/crates/ide/src/highlight_related.rs b/crates/ide/src/highlight_related.rs index dfe8dcaa7745..edf75841fe2c 100644 --- a/crates/ide/src/highlight_related.rs +++ b/crates/ide/src/highlight_related.rs @@ -110,7 +110,7 @@ fn highlight_closure_captures( file_id: EditionedFileId, ) -> Option> { let closure = token.parent_ancestors().take(2).find_map(ast::ClosureExpr::cast)?; - let search_range = closure.body()?.syntax().text_range(); + let search_range = closure.body()?.syntax().text_range_without_outer_trivia(); let ty = &sema.type_of_expr(&closure.into())?.original; let c = ty.as_closure()?; Some( @@ -244,7 +244,7 @@ fn highlight_references( for_each_tail_expr(&block.into(), &mut |tail| { if !matches!(tail, ast::Expr::BreakExpr(_)) { res.insert(HighlightedRange { - range: tail.syntax().text_range(), + range: tail.syntax().text_range_without_outer_trivia(), category: ReferenceCategory::empty(), }); } @@ -325,7 +325,7 @@ pub(crate) fn highlight_branch_exit_points( for_each_tail_expr(&tail, &mut |tail| { let file_id = sema.hir_file_for(tail.syntax()); - let range = tail.syntax().text_range(); + let range = tail.syntax().text_range_without_outer_trivia(); push_to_highlights(file_id, Some(range), highlights); }); }; @@ -415,7 +415,7 @@ fn hl_exit_points( ast::Expr::MethodCallExpr(_) | ast::Expr::CallExpr(_) | ast::Expr::MacroExpr(_) if sema.type_of_expr(&expr).is_some_and(|ty| ty.original.is_never()) => { - Some(expr.syntax().text_range()) + Some(expr.syntax().text_range_without_outer_trivia()) } _ => None, }; @@ -447,10 +447,11 @@ fn hl_exit_points( for_each_tail_expr(&tail, &mut |tail| { let file_id = sema.hir_file_for(tail.syntax()); let range = match tail { - ast::Expr::BreakExpr(b) => b - .break_token() - .map_or_else(|| tail.syntax().text_range(), |tok| tok.text_range()), - _ => tail.syntax().text_range(), + ast::Expr::BreakExpr(b) => b.break_token().map_or_else( + || tail.syntax().text_range_without_outer_trivia(), + |tok| tok.text_range(), + ), + _ => tail.syntax().text_range_without_outer_trivia(), }; push_to_highlights(file_id, Some(range)); }); @@ -512,7 +513,7 @@ pub(crate) fn highlight_break_points( if let Some(range) = cover_range( loop_token.as_ref().map(|tok| tok.text_range()), - label.as_ref().map(|it| it.syntax().text_range()), + label.as_ref().map(|it| it.syntax().text_range_without_outer_trivia()), ) { let file_id = loop_token .and_then(|tok| Some(sema.hir_file_for(&tok.parent()?))) @@ -542,7 +543,7 @@ pub(crate) fn highlight_break_points( let text_range = cover_range( token.map(|it| it.text_range()), - token_lt.map(|it| it.syntax().text_range()), + token_lt.map(|it| it.syntax().text_range_without_outer_trivia()), ); push_to_highlights(file_id, text_range); @@ -555,7 +556,7 @@ pub(crate) fn highlight_break_points( } let file_id = sema.hir_file_for(tail.syntax()); - let range = tail.syntax().text_range(); + let range = tail.syntax().text_range_without_outer_trivia(); push_to_highlights(file_id, Some(range)); }); } @@ -810,7 +811,10 @@ pub(crate) fn highlight_unsafe_points( if let Some(block) = block_expr { let unsafe_ops = sema.get_unsafe_ops_for_unsafe_block(block); for unsafe_op in unsafe_ops { - push_to_highlights(unsafe_op.file_id, Some(unsafe_op.value.text_range())); + let root = sema.parse_or_expand(unsafe_op.file_id); + let range = + unsafe_op.value.to_node(&root).syntax().text_range_without_outer_trivia(); + push_to_highlights(unsafe_op.file_id, Some(range)); } } diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs index 6f5878071aaa..6c7ad90fa19e 100644 --- a/crates/ide/src/hover.rs +++ b/crates/ide/src/hover.rs @@ -177,7 +177,6 @@ fn hover_offset( T!['['] | T![']'] | T![?] | T![*] | T![-] | T![!] | T![|] => 3, kind if kind.is_keyword(edition) => 2, T!['('] | T![')'] => 2, - kind if kind.is_trivia() => 0, _ => 1, })?; @@ -442,8 +441,8 @@ fn hover_ranged( res.or_else(|| render::type_info_of(sema, config, &expr_or_pat, edition, display_target)); res.map(|it| { let range = match expr_or_pat { - Either::Left(it) => it.syntax().text_range(), - Either::Right(it) => it.syntax().text_range(), + Either::Left(it) => it.syntax().text_range_without_outer_trivia(), + Either::Right(it) => it.syntax().text_range_without_outer_trivia(), }; RangeInfo::new(range, it) }) diff --git a/crates/ide/src/hover/render.rs b/crates/ide/src/hover/render.rs index 189716882186..9481cb6caf6b 100644 --- a/crates/ide/src/hover/render.rs +++ b/crates/ide/src/hover/render.rs @@ -22,7 +22,7 @@ use rustc_apfloat::{ }; use span::{Edition, TextSize}; use stdx::format_to; -use syntax::{AstNode, AstToken, Direction, SyntaxToken, T, algo, ast, match_ast}; +use syntax::{AstNode, AstToken, SyntaxElement, SyntaxToken, T, ast, match_ast}; use crate::{ HoverAction, HoverConfig, HoverResult, Markup, MemoryLayoutHoverConfig, @@ -307,17 +307,18 @@ pub(super) fn struct_rest_pat( pub(super) fn try_for_lint(attr: &ast::Attr, token: &SyntaxToken) -> Option { let (path, tt) = attr.as_simple_call()?; - if !tt.syntax().text_range().contains(token.text_range().start()) { + if !tt.syntax().text_range_without_outer_trivia().contains(token.text_range().start()) { return None; } let (is_clippy, lints) = match &*path { "feature" => (false, FEATURES), "allow" | "deny" | "expect" | "forbid" | "warn" => { - let is_clippy = algo::non_trivia_sibling(token.clone().into(), Direction::Prev) + let is_clippy = SyntaxElement::from(token.clone()) + .prev_sibling_or_token() .filter(|t| t.kind() == T![:]) - .and_then(|t| algo::non_trivia_sibling(t, Direction::Prev)) + .and_then(|t| t.prev_sibling_or_token()) .filter(|t| t.kind() == T![:]) - .and_then(|t| algo::non_trivia_sibling(t, Direction::Prev)) + .and_then(|t| t.prev_sibling_or_token()) .is_some_and(|t| { t.kind() == T![ident] && t.into_token().is_some_and(|t| t.text() == "clippy") }); diff --git a/crates/ide/src/hover/tests.rs b/crates/ide/src/hover/tests.rs index c8aa8a222164..3b8ea3e43cd9 100644 --- a/crates/ide/src/hover/tests.rs +++ b/crates/ide/src/hover/tests.rs @@ -4221,7 +4221,7 @@ pub mod future { file_id: FileId( 0, ), - full_range: 0..110, + full_range: 101..110, focus_range: 108..109, name: "S", kind: Struct, diff --git a/crates/ide/src/inlay_hints/adjustment.rs b/crates/ide/src/inlay_hints/adjustment.rs index 283ec29dc05b..2d7a029fb6f5 100644 --- a/crates/ide/src/inlay_hints/adjustment.rs +++ b/crates/ide/src/inlay_hints/adjustment.rs @@ -78,7 +78,7 @@ pub(super) fn hints( let (postfix, needs_outer_parens, needs_inner_parens) = mode_and_needs_parens_for_adjustment_hints(expr, config.adjustment_hints_mode); - let range = expr.syntax().text_range(); + let range = expr.syntax().text_range_without_outer_trivia(); let mut pre = InlayHint { range, position: InlayHintPosition::Before, diff --git a/crates/ide/src/inlay_hints/bind_pat.rs b/crates/ide/src/inlay_hints/bind_pat.rs index 8af78532f370..6d9b7106ce01 100644 --- a/crates/ide/src/inlay_hints/bind_pat.rs +++ b/crates/ide/src/inlay_hints/bind_pat.rs @@ -87,7 +87,7 @@ pub(super) fn hints( &ty, colon_token .as_ref() - .map_or_else(|| pat.syntax().text_range(), |t| t.text_range()) + .map_or_else(|| pat.syntax().text_range_without_outer_trivia(), |t| t.text_range()) .end(), &|_| (), if colon_token.is_some() { "" } else { ": " }, @@ -102,8 +102,8 @@ pub(super) fn hints( } let text_range = match pat.name() { - Some(name) => name.syntax().text_range(), - None => pat.syntax().text_range(), + Some(name) => name.syntax().text_range_without_outer_trivia(), + None => pat.syntax().text_range_without_outer_trivia(), }; let mut range = match type_ascriptable { Some(Some(t)) => text_range.cover(t.text_range()), @@ -114,7 +114,7 @@ pub(super) fn hints( if matches!(config.type_hints_placement, TypeHintsPlacement::EndOfLine) && let Some(let_stmt) = enclosing_let_stmt { - let stmt_range = let_stmt.syntax().text_range(); + let stmt_range = let_stmt.syntax().text_range_without_outer_trivia(); range = TextRange::new(range.start(), stmt_range.end()); pad_left = true; } @@ -126,7 +126,7 @@ pub(super) fn hints( position: InlayHintPosition::After, pad_left, pad_right: false, - resolve_parent: Some(pat.syntax().text_range()), + resolve_parent: Some(pat.syntax().text_range_without_outer_trivia()), }); Some(()) diff --git a/crates/ide/src/inlay_hints/binding_mode.rs b/crates/ide/src/inlay_hints/binding_mode.rs index 63a83ea33528..084e31a66894 100644 --- a/crates/ide/src/inlay_hints/binding_mode.rs +++ b/crates/ide/src/inlay_hints/binding_mode.rs @@ -27,12 +27,13 @@ pub(super) fn hints( || match pat { // for ident patterns that @ bind a name, render the un-ref patterns in front of the inner pattern // instead of the name as that makes it more clear and doesn't really change the outcome - ast::Pat::IdentPat(it) => { - it.pat().map_or_else(|| it.syntax().text_range(), |it| it.syntax().text_range()) - } - it => it.syntax().text_range(), + ast::Pat::IdentPat(it) => it.pat().map_or_else( + || it.syntax().text_range_without_outer_trivia(), + |it| it.syntax().text_range_without_outer_trivia(), + ), + it => it.syntax().text_range_without_outer_trivia(), }, - |it| it.syntax().text_range(), + |it| it.syntax().text_range_without_outer_trivia(), ); let mut hint = InlayHint { range, @@ -42,7 +43,7 @@ pub(super) fn hints( position: InlayHintPosition::Before, pad_left: false, pad_right: false, - resolve_parent: Some(pat.syntax().text_range()), + resolve_parent: Some(pat.syntax().text_range_without_outer_trivia()), }; let pattern_adjustments = sema.pattern_adjustments(pat); let mut was_mut_last = false; @@ -70,14 +71,14 @@ pub(super) fn hints( }; if let Some(bm) = bm { acc.push(InlayHint { - range: pat.syntax().text_range(), + range: pat.syntax().text_range_without_outer_trivia(), kind: InlayKind::BindingMode, label: bm.into(), text_edit: None, position: InlayHintPosition::Before, pad_left: false, pad_right: true, - resolve_parent: Some(pat.syntax().text_range()), + resolve_parent: Some(pat.syntax().text_range_without_outer_trivia()), }); } } @@ -86,7 +87,7 @@ pub(super) fn hints( was_mut_last = false; acc.push(InlayHint::closing_paren_after( InlayKind::BindingMode, - pat.syntax().text_range(), + pat.syntax().text_range_without_outer_trivia(), )); } _ => (), diff --git a/crates/ide/src/inlay_hints/bounds.rs b/crates/ide/src/inlay_hints/bounds.rs index 045559fd7f46..5927cc59bf9e 100644 --- a/crates/ide/src/inlay_hints/bounds.rs +++ b/crates/ide/src/inlay_hints/bounds.rs @@ -29,7 +29,8 @@ pub(super) fn hints( let has_bounds = type_param.type_bound_list().is_some_and(|it| it.bounds().next().is_some()); acc.push(InlayHint { - range: c.unwrap_or_else(|| type_param.syntax().text_range()), + range: c + .unwrap_or_else(|| type_param.syntax().text_range_without_outer_trivia()), kind: InlayKind::Type, label: { let mut hint = InlayHintLabel::default(); @@ -68,7 +69,7 @@ pub(super) fn hints( position: InlayHintPosition::After, pad_left: c.is_some(), pad_right: has_bounds, - resolve_parent: Some(params.syntax().text_range()), + resolve_parent: Some(params.syntax().text_range_without_outer_trivia()), }); } ast::TypeOrConstParam::Const(_) => (), diff --git a/crates/ide/src/inlay_hints/chaining.rs b/crates/ide/src/inlay_hints/chaining.rs index e008a7b94066..e7e63d5eec63 100644 --- a/crates/ide/src/inlay_hints/chaining.rs +++ b/crates/ide/src/inlay_hints/chaining.rs @@ -2,7 +2,7 @@ use hir::DisplayTarget; use ide_db::famous_defs::FamousDefs; use syntax::{ - Direction, NodeOrToken, SyntaxKind, T, TextRange, + SyntaxKind, T, TextRange, ast::{self, AstNode}, }; @@ -28,60 +28,42 @@ pub(super) fn hints( let descended = sema.descend_node_into_attributes(expr.clone()).pop(); let desc_expr = descended.as_ref().unwrap_or(expr); - let mut tokens = expr - .syntax() - .siblings_with_tokens(Direction::Next) - .filter_map(NodeOrToken::into_token) - .filter(|t| match t.kind() { - SyntaxKind::WHITESPACE if !t.text().contains('\n') => false, - SyntaxKind::COMMENT | SyntaxKind::OUTER_DOC_COMMENT | SyntaxKind::INNER_DOC_COMMENT => { - false - } - _ => true, - }); - - // Chaining can be defined as an expression whose next sibling tokens are newline and dot - // Ignoring extra whitespace and comments - let next_token = tokens.next()?; - if next_token.kind() == SyntaxKind::WHITESPACE { - let newline_token = next_token; - let mut next_next = tokens.next()?; - while next_next.kind() == SyntaxKind::WHITESPACE { - next_next = tokens.next()?; + let last = expr.syntax().last_non_trivia_token()?; + let next_token = last.next_non_trivia_token()?; + let newline_token = + last.trivia_after().find(|trivia_token| trivia_token.kind() == SyntaxKind::NEWLINE)?; + if next_token.kind() == T![.] { + let ty = sema.type_of_expr(desc_expr)?.original; + if ty.is_unknown() { + return None; } - if next_next.kind() == T![.] { - let ty = sema.type_of_expr(desc_expr)?.original; - if ty.is_unknown() { - return None; - } - if matches!(expr, ast::Expr::PathExpr(_)) - && let Some(hir::Adt::Struct(st)) = ty.as_adt() - && st.fields(sema.db).is_empty() - { - return None; - } - let label = label_of_ty(famous_defs, config, &ty, display_target)?; - let range = { - let mut range = expr.syntax().text_range(); - if config.type_hints_placement == TypeHintsPlacement::EndOfLine { - range = TextRange::new( - range.start(), - newline_token.text_range().start().max(range.end()), - ); - } - range - }; - acc.push(InlayHint { - range, - kind: InlayKind::Chaining, - label, - text_edit: None, - position: InlayHintPosition::After, - pad_left: true, - pad_right: false, - resolve_parent: Some(expr.syntax().text_range()), - }); + if matches!(expr, ast::Expr::PathExpr(_)) + && let Some(hir::Adt::Struct(st)) = ty.as_adt() + && st.fields(sema.db).is_empty() + { + return None; } + let label = label_of_ty(famous_defs, config, &ty, display_target)?; + let range = { + let mut range = expr.syntax().text_range_without_outer_trivia(); + if config.type_hints_placement == TypeHintsPlacement::EndOfLine { + range = TextRange::new( + range.start(), + newline_token.text_range().start().max(range.end()), + ); + } + range + }; + acc.push(InlayHint { + range, + kind: InlayKind::Chaining, + label, + text_edit: None, + position: InlayHintPosition::After, + pad_left: true, + pad_right: false, + resolve_parent: Some(expr.syntax().text_range_without_outer_trivia()), + }); } Some(()) } diff --git a/crates/ide/src/inlay_hints/closing_brace.rs b/crates/ide/src/inlay_hints/closing_brace.rs index 836ebfbcf744..cc8f304694e9 100644 --- a/crates/ide/src/inlay_hints/closing_brace.rs +++ b/crates/ide/src/inlay_hints/closing_brace.rs @@ -27,7 +27,7 @@ pub(super) fn hints( ) -> Option<()> { let min_lines = config.closing_brace_hints_min_lines?; - let name = |it: ast::Name| it.syntax().text_range(); + let name = |it: ast::Name| it.syntax().text_range_without_outer_trivia(); let mut node = node.clone(); let mut closing_token; @@ -90,7 +90,7 @@ pub(super) fn hints( let lifetime = label.lifetime()?.to_string(); - (lifetime, Some(label.syntax().text_range())) + (lifetime, Some(label.syntax().text_range_without_outer_trivia())) } else if let Some(block) = ast::BlockExpr::cast(node.clone()) { closing_token = block.stmt_list()?.r_curly_token()?; @@ -140,7 +140,7 @@ pub(super) fn hints( } } else { let mac = ast::MacroCall::cast(node.clone())?; - let last_token = mac.syntax().last_token()?; + let last_token = mac.syntax().last_non_trivia_token()?; if last_token.kind() != T![;] && last_token.kind() != SyntaxKind::R_CURLY { return None; } @@ -148,25 +148,29 @@ pub(super) fn hints( ( format!("{}!", mac.path()?), - mac.path().and_then(|it| it.segment()).map(|it| it.syntax().text_range()), + mac.path() + .and_then(|it| it.segment()) + .map(|it| it.syntax().text_range_without_outer_trivia()), ) }; - if let Some(mut next) = closing_token.next_token() { - if next.kind() == T![;] - && let Some(tok) = next.next_token() - { - closing_token = next; - next = tok; - } - if !(next.kind() == SyntaxKind::WHITESPACE && next.text().contains('\n')) { - // Only display the hint if the `}` is the last token on the line - return None; - } + if let Some(next) = closing_token.next_token().filter(|it| it.kind() == T![;]) { + closing_token = next; + } + let last_on_line = match closing_token + .trivia_after() + .find(|it| it.kind() != SyntaxKind::WHITESPACE) + { + Some(it) => it.kind() == SyntaxKind::NEWLINE, + None => closing_token.next_non_trivia_token().is_none_or(|it| it.kind() == SyntaxKind::EOF), + }; + if !last_on_line { + // Only display the hint if the `}` is the last token on the line + return None; } let mut lines = 1; - node.text().for_each_chunk(|s| lines += s.matches('\n').count()); + node.text_without_outer_trivia().for_each_chunk(|chunk| lines += chunk.matches('\n').count()); if lines < min_lines { return None; } @@ -181,7 +185,7 @@ pub(super) fn hints( position: InlayHintPosition::After, pad_left: true, pad_right: false, - resolve_parent: Some(node.text_range()), + resolve_parent: Some(node.text_range_without_outer_trivia()), }); None @@ -259,7 +263,7 @@ fn format_let_else_label(let_else: &ast::LetElse, config: &InlayHintsConfig<'_>) } fn snippet_from_node(node: &SyntaxNode, config: &InlayHintsConfig<'_>) -> String { - let mut text = node.text().to_string(); + let mut text = node.text_without_outer_trivia().to_string(); if text.contains('\n') { return ELLIPSIS.into(); } diff --git a/crates/ide/src/inlay_hints/closure_captures.rs b/crates/ide/src/inlay_hints/closure_captures.rs index dc36bd776db6..861390b301a9 100644 --- a/crates/ide/src/inlay_hints/closure_captures.rs +++ b/crates/ide/src/inlay_hints/closure_captures.rs @@ -74,7 +74,7 @@ pub(super) fn hints( position, pad_left: false, pad_right, - resolve_parent: Some(expr.syntax().text_range()), + resolve_parent: Some(expr.syntax().text_range_without_outer_trivia()), }; hint.label.append_str("("); let last = captures.len() - 1; diff --git a/crates/ide/src/inlay_hints/closure_ret.rs b/crates/ide/src/inlay_hints/closure_ret.rs index 7765dc4f087c..397694e6e381 100644 --- a/crates/ide/src/inlay_hints/closure_ret.rs +++ b/crates/ide/src/inlay_hints/closure_ret.rs @@ -35,7 +35,7 @@ pub(super) fn hints( let param_list = closure.param_list()?; - let resolve_parent = Some(closure.syntax().text_range()); + let resolve_parent = Some(closure.syntax().text_range_without_outer_trivia()); let descended_closure = sema.descend_node_into_attributes(closure.clone()).pop()?; let ty = sema.type_of_expr(&ast::Expr::ClosureExpr(descended_closure.clone()))?.adjusted(); let callable = ty.as_callable(sema.db)?; @@ -50,12 +50,17 @@ pub(super) fn hints( label.prepend_str(" -> "); } - let offset_to_insert_ty = - arrow.as_ref().map_or_else(|| param_list.syntax().text_range(), |t| t.text_range()).end(); + let offset_to_insert_ty = arrow + .as_ref() + .map_or_else(|| param_list.syntax().text_range_without_outer_trivia(), |t| t.text_range()) + .end(); // Insert braces if necessary let insert_braces = |builder: &mut TextEditBuilder| { - if !has_block_body && let Some(range) = closure.body().map(|b| b.syntax().text_range()) { + if !has_block_body + && let Some(range) = + closure.body().map(|b| b.syntax().text_range_without_outer_trivia()) + { builder.insert(range.start(), "{ ".to_owned()); builder.insert(range.end(), " }".to_owned()); } @@ -72,7 +77,7 @@ pub(super) fn hints( ); acc.push(InlayHint { - range: param_list.syntax().text_range(), + range: param_list.syntax().text_range_without_outer_trivia(), kind: InlayKind::Type, label, text_edit, diff --git a/crates/ide/src/inlay_hints/discriminant.rs b/crates/ide/src/inlay_hints/discriminant.rs index e845faec565f..12b8a52b299d 100644 --- a/crates/ide/src/inlay_hints/discriminant.rs +++ b/crates/ide/src/inlay_hints/discriminant.rs @@ -59,8 +59,11 @@ fn variant_hints( let d = v.eval(sema.db); let range = match variant.field_list() { - Some(field_list) => name.syntax().text_range().cover(field_list.syntax().text_range()), - None => name.syntax().text_range(), + Some(field_list) => name + .syntax() + .text_range_without_outer_trivia() + .cover(field_list.syntax().text_range_without_outer_trivia()), + None => name.syntax().text_range_without_outer_trivia(), }; let eq_ = if eq_token.is_none() { " =" } else { "" }; let label = InlayHintLabel::simple( @@ -95,7 +98,7 @@ fn variant_hints( position: InlayHintPosition::After, pad_left: false, pad_right: false, - resolve_parent: Some(enum_.syntax().text_range()), + resolve_parent: Some(enum_.syntax().text_range_without_outer_trivia()), }); Some(()) diff --git a/crates/ide/src/inlay_hints/extern_block.rs b/crates/ide/src/inlay_hints/extern_block.rs index 8dd6c4db4c04..65d642a4b102 100644 --- a/crates/ide/src/inlay_hints/extern_block.rs +++ b/crates/ide/src/inlay_hints/extern_block.rs @@ -16,16 +16,19 @@ pub(super) fn extern_block_hints( let abi = extern_block.abi()?; sema.to_def(&extern_block)?; acc.push(InlayHint { - range: abi.syntax().text_range(), + range: abi.syntax().text_range_without_outer_trivia(), position: crate::InlayHintPosition::Before, pad_left: false, pad_right: true, kind: crate::InlayKind::ExternUnsafety, label: crate::InlayHintLabel::from("unsafe"), text_edit: Some(config.lazy_text_edit(|| { - TextEdit::insert(abi.syntax().text_range().start(), "unsafe ".to_owned()) + TextEdit::insert( + abi.syntax().text_range_without_outer_trivia().start(), + "unsafe ".to_owned(), + ) })), - resolve_parent: Some(extern_block.syntax().text_range()), + resolve_parent: Some(extern_block.syntax().text_range_without_outer_trivia()), }); Some(()) } @@ -84,11 +87,14 @@ fn item_hint( if extern_block.unsafe_token().is_none() && let Some(abi) = extern_block.abi() { - builder.insert(abi.syntax().text_range().start(), "unsafe ".to_owned()); + builder.insert( + abi.syntax().text_range_without_outer_trivia().start(), + "unsafe ".to_owned(), + ); } builder.finish() })), - resolve_parent: Some(extern_block.syntax().text_range()), + resolve_parent: Some(extern_block.syntax().text_range_without_outer_trivia()), } } diff --git a/crates/ide/src/inlay_hints/generic_param.rs b/crates/ide/src/inlay_hints/generic_param.rs index 27d14f7a73cd..978db86f467b 100644 --- a/crates/ide/src/inlay_hints/generic_param.rs +++ b/crates/ide/src/inlay_hints/generic_param.rs @@ -28,7 +28,7 @@ pub(crate) fn hints( let generic_arg_list = node.generic_arg_list()?; let (generic_def, _, _, _) = - generic_def_for_node(sema, &generic_arg_list, &node.syntax().first_token()?)?; + generic_def_for_node(sema, &generic_arg_list, &node.syntax().first_non_trivia_token()?)?; let mut args = generic_arg_list.generic_args().peekable(); let start_with_lifetime = matches!(args.peek()?, ast::GenericArg::LifetimeArg(_)); @@ -117,7 +117,7 @@ pub(crate) fn hints( kind: InlayKind::GenericParameter, label, text_edit: None, - resolve_parent: Some(node.syntax().text_range()), + resolve_parent: Some(node.syntax().text_range_without_outer_trivia()), }) }); diff --git a/crates/ide/src/inlay_hints/implicit_drop.rs b/crates/ide/src/inlay_hints/implicit_drop.rs index 9387573cf7ac..4662dd577067 100644 --- a/crates/ide/src/inlay_hints/implicit_drop.rs +++ b/crates/ide/src/inlay_hints/implicit_drop.rs @@ -125,7 +125,7 @@ pub(super) fn hints( kind: InlayKind::Drop, label, text_edit: None, - resolve_parent: Some(node.syntax().text_range()), + resolve_parent: Some(node.syntax().text_range_without_outer_trivia()), }) } } diff --git a/crates/ide/src/inlay_hints/implied_dyn_trait.rs b/crates/ide/src/inlay_hints/implied_dyn_trait.rs index ac91da9a3cec..8d82d88ede72 100644 --- a/crates/ide/src/inlay_hints/implied_dyn_trait.rs +++ b/crates/ide/src/inlay_hints/implied_dyn_trait.rs @@ -42,14 +42,14 @@ pub(super) fn hints( return None; } sema.resolve_trait(&path.path()?)?; - path.syntax().text_range() + path.syntax().text_range_without_outer_trivia() } Either::Right(dyn_) => { if dyn_.dyn_token().is_some() { return None; } - dyn_.syntax().text_range() + dyn_.syntax().text_range_without_outer_trivia() } }; diff --git a/crates/ide/src/inlay_hints/lifetime.rs b/crates/ide/src/inlay_hints/lifetime.rs index 89a2d9fa97eb..f25464e8cb19 100644 --- a/crates/ide/src/inlay_hints/lifetime.rs +++ b/crates/ide/src/inlay_hints/lifetime.rs @@ -31,7 +31,7 @@ pub(super) fn fn_hints( let param_list = func.param_list()?; let generic_param_list = func.generic_param_list(); let ret_type = func.ret_type(); - let gpl_append_range = func.name()?.syntax().text_range(); + let gpl_append_range = func.name()?.syntax().text_range_without_outer_trivia(); hints_( acc, ctx, @@ -110,7 +110,7 @@ pub(super) fn fn_ptr_hints( let for_ = if has_for { "" } else { "for" }; acc.push(InlayHint { range: for_kw.map_or_else( - || func.syntax().first_token().unwrap().text_range(), + || func.syntax().first_non_trivia_token().unwrap().text_range(), |it| it.text_range(), ), kind: InlayKind::GenericParamList, @@ -167,7 +167,7 @@ pub(super) fn fn_path_hints( let for_ = if has_for { "" } else { "for" }; acc.push(InlayHint { range: for_kw.map_or_else( - || func.syntax().first_token().unwrap().text_range(), + || func.syntax().first_non_trivia_token().unwrap().text_range(), |it| it.text_range(), ), kind: InlayKind::GenericParamList, diff --git a/crates/ide/src/inlay_hints/param_name.rs b/crates/ide/src/inlay_hints/param_name.rs index fcf1304d4b47..8c01f6028787 100644 --- a/crates/ide/src/inlay_hints/param_name.rs +++ b/crates/ide/src/inlay_hints/param_name.rs @@ -85,7 +85,7 @@ pub(super) fn hints( position: InlayHintPosition::Before, pad_left: false, pad_right: true, - resolve_parent: Some(expr.syntax().text_range()), + resolve_parent: Some(expr.syntax().text_range_without_outer_trivia()), } }); @@ -137,7 +137,7 @@ pub(super) fn hints( position: InlayHintPosition::Before, pad_left: true, pad_right: false, - resolve_parent: Some(expr.syntax().text_range()), + resolve_parent: Some(expr.syntax().text_range_without_outer_trivia()), }); } } diff --git a/crates/ide/src/join_lines.rs b/crates/ide/src/join_lines.rs index 4c648d3cb9a0..a2f05c852d2b 100644 --- a/crates/ide/src/join_lines.rs +++ b/crates/ide/src/join_lines.rs @@ -2,8 +2,8 @@ use ide_assists::utils::extract_trivial_expression; use ide_db::syntax_helpers::node_ext::expr_as_name_ref; use itertools::Itertools; use syntax::{ - NodeOrToken, SourceFile, SyntaxElement, - SyntaxKind::{self, USE_TREE, WHITESPACE}, + SourceFile, SyntaxElement, + SyntaxKind::{self, NEWLINE, USE_TREE, WHITESPACE}, SyntaxToken, T, TextRange, TextSize, ast::{self, AstNode, AstToken, IsString}, }; @@ -46,14 +46,16 @@ pub(crate) fn join_lines( }; let mut edit = TextEdit::builder(); - match file.syntax().covering_element(range) { - NodeOrToken::Node(node) => { - for token in node.descendants_with_tokens().filter_map(|it| it.into_token()) { - remove_newlines(config, &mut edit, &token, range) - } + let mut trivia_token = file.syntax().token_at_offset(range.start()).right_biased(); + while let Some(token) = trivia_token { + if token.text_range().start() >= range.end() { + break; } - NodeOrToken::Token(token) => remove_newlines(config, &mut edit, &token, range), - }; + if token.text_range().end() > range.start() { + remove_newlines(config, &mut edit, &token, range); + } + trivia_token = token.next_token(); + } edit.finish() } @@ -63,10 +65,15 @@ fn remove_newlines( token: &SyntaxToken, range: TextRange, ) { - let intersection = match range.intersect(token.text_range()) { - Some(range) => range, - None => return, - }; + let Some(intersection) = range.intersect(token.text_range()) else { return }; + + if token.kind() == NEWLINE { + let offset = token.text_range().start(); + if !edit.invalidates_offset(offset) { + remove_newline(config, edit, token); + } + return; + } let range = intersection - token.text_range().start(); let text = token.text(); @@ -74,58 +81,98 @@ fn remove_newlines( let pos: TextSize = (pos as u32).into(); let offset = token.text_range().start() + range.start() + pos; if !edit.invalidates_offset(offset) { - remove_newline(config, edit, token, offset); + join_inside_token(edit, token, offset); } } } -fn remove_newline( - config: &JoinLinesConfig, - edit: &mut TextEditBuilder, - token: &SyntaxToken, - offset: TextSize, -) { - if token.kind() != WHITESPACE || token.text().bytes().filter(|&b| b == b'\n').count() != 1 { - let n_spaces_after_line_break = { - let suff = &token.text()[TextRange::new( - offset - token.text_range().start() + TextSize::of('\n'), - TextSize::of(token.text()), - )]; - suff.bytes().take_while(|&b| b == b' ').count() - }; +fn join_inside_token(edit: &mut TextEditBuilder, token: &SyntaxToken, offset: TextSize) { + let n_spaces_after_line_break = { + let suff = &token.text()[TextRange::new( + offset - token.text_range().start() + TextSize::of('\n'), + TextSize::of(token.text()), + )]; + suff.bytes().take_while(|&b| b == b' ').count() + }; - let mut no_space = false; - if let Some(string) = ast::String::cast(token.clone()) { - if let Some(range) = string.open_quote_text_range() { - cov_mark::hit!(join_string_literal_open_quote); - no_space |= range.end() == offset; - } - if let Some(range) = string.close_quote_text_range() { - cov_mark::hit!(join_string_literal_close_quote); - no_space |= range.start() - == offset - + TextSize::of('\n') - + TextSize::try_from(n_spaces_after_line_break).unwrap(); + let mut no_space = false; + if let Some(string) = ast::String::cast(token.clone()) { + if let Some(range) = string.open_quote_text_range() { + cov_mark::hit!(join_string_literal_open_quote); + no_space |= range.end() == offset; + } + if let Some(range) = string.close_quote_text_range() { + cov_mark::hit!(join_string_literal_close_quote); + no_space |= range.start() + == offset + + TextSize::of('\n') + + TextSize::try_from(n_spaces_after_line_break).unwrap(); + } + } + + let range = TextRange::at(offset, ((n_spaces_after_line_break + 1) as u32).into()); + let replace_with = if no_space { "" } else { " " }; + edit.replace(range, replace_with.to_owned()); +} + +fn gap_siblings(prev: &SyntaxToken, next: &SyntaxToken) -> Option<(SyntaxElement, SyntaxElement)> { + let parent = + prev.parent_ancestors().find(|node| node.text_range().contains_range(next.text_range()))?; + let mut children = parent.children_with_tokens(); + let left = children.find(|it| it.text_range().contains_range(prev.text_range()))?; + let right = children.find(|it| it.text_range().contains_range(next.text_range()))?; + Some((left, right)) +} + +fn remove_newline(config: &JoinLinesConfig, edit: &mut TextEditBuilder, newline: &SyntaxToken) { + let syntax::algo::BlankRun { range: gap, before, after, newlines } = + syntax::algo::blank_run(newline); + if newlines != 1 { + let mut end = newline.text_range().end(); + let mut next = newline.next_token(); + while let Some(it) = next { + if it.kind() != WHITESPACE { + break; } + end = it.text_range().end(); + next = it.next_token(); } + edit.replace(TextRange::new(newline.text_range().start(), end), " ".to_owned()); + return; + } - let range = TextRange::at(offset, ((n_spaces_after_line_break + 1) as u32).into()); - let replace_with = if no_space { "" } else { " " }; - edit.replace(range, replace_with.to_owned()); + if let (Some(before), Some(after)) = (&before, &after) + && ast::AnyComment::cast(before.clone()).is_some() + && let Some(next) = ast::AnyComment::cast(after.clone()) + { + edit.delete(TextRange::new( + gap.start(), + next.syntax().text_range().start() + TextSize::of(next.prefix()), + )); return; } - // The node is between two other nodes - let (prev, next) = match (token.prev_sibling_or_token(), token.next_sibling_or_token()) { - (Some(prev), Some(next)) => (prev, next), - _ => return, + let (Some(a), Some(b)) = (newline.prev_non_trivia_token(), newline.next_non_trivia_token()) + else { + return; }; + if b.kind() == SyntaxKind::EOF { + return; + } + if before.is_some_and(|it| ast::AnyComment::can_cast(it.kind())) + || after.is_some_and(|it| ast::AnyComment::can_cast(it.kind())) + { + edit.replace(gap, " ".to_owned()); + return; + } + + let Some((prev, next)) = gap_siblings(&a, &b) else { return }; if config.remove_trailing_comma && prev.kind() == T![,] { match next.kind() { T![')'] | T![']'] => { // Removes: trailing comma, newline (incl. surrounding whitespace) - edit.delete(TextRange::new(prev.text_range().start(), token.text_range().end())); + edit.delete(TextRange::new(prev.text_range().start(), gap.end())); return; } T!['}'] => { @@ -135,7 +182,7 @@ fn remove_newline( None => " ", }; edit.replace( - TextRange::new(prev.text_range().start(), token.text_range().end()), + TextRange::new(prev.text_range().start(), gap.end()), space.to_owned(), ); return; @@ -151,7 +198,7 @@ fn remove_newline( Some(_) => cov_mark::hit!(join_two_ifs_with_existing_else), None => { cov_mark::hit!(join_two_ifs); - edit.replace(token.text_range(), " else ".to_owned()); + edit.replace(gap, " else ".to_owned()); return; } } @@ -171,7 +218,7 @@ fn remove_newline( // ``` // // into `my_function()` - if join_single_expr_block(edit, token).is_some() { + if join_single_expr_block(edit, newline).is_some() { return; } // ditto for @@ -181,37 +228,24 @@ fn remove_newline( // bar // }; // ``` - if join_single_use_tree(edit, token).is_some() { + if join_single_use_tree(edit, newline).is_some() { return; } } - // We can't use `prev` and `next`, since `DOC_COMMENT` has only one token, so `token` has no siblings. - if let (Some(_), Some(next)) = ( - token.prev_token().and_then(ast::AnyComment::cast), - token.next_token().and_then(ast::AnyComment::cast), - ) { - // Removes: newline (incl. surrounding whitespace), start of the next comment - edit.delete(TextRange::new( - token.text_range().start(), - next.syntax().text_range().start() + TextSize::of(next.prefix()), - )); - return; - } - // Remove newline but add a computed amount of whitespace characters - edit.replace(token.text_range(), compute_ws(prev.kind(), next.kind()).to_owned()); + edit.replace(gap, compute_ws(prev.kind(), next.kind()).to_owned()); } fn join_single_expr_block(edit: &mut TextEditBuilder, token: &SyntaxToken) -> Option<()> { - let block_expr = ast::BlockExpr::cast(token.parent_ancestors().nth(1)?)?; + let block_expr = ast::BlockExpr::cast(token.owning_node()?.parent()?)?; if !block_expr.is_standalone() { return None; } let expr = extract_trivial_expression(&block_expr)?; - let block_range = block_expr.syntax().text_range(); - let mut buf = expr.syntax().text().to_string(); + let block_range = block_expr.syntax().text_range_without_outer_trivia(); + let mut buf = expr.syntax().text_without_outer_trivia().to_string(); // Match block needs to have a comma after the block if let Some(match_arm) = block_expr.syntax().parent().and_then(ast::MatchArm::cast) @@ -226,9 +260,12 @@ fn join_single_expr_block(edit: &mut TextEditBuilder, token: &SyntaxToken) -> Op } fn join_single_use_tree(edit: &mut TextEditBuilder, token: &SyntaxToken) -> Option<()> { - let use_tree_list = ast::UseTreeList::cast(token.parent()?)?; + let use_tree_list = ast::UseTreeList::cast(token.owning_node()?)?; let (tree,) = use_tree_list.use_trees().collect_tuple()?; - edit.replace(use_tree_list.syntax().text_range(), tree.syntax().text().to_string()); + edit.replace( + use_tree_list.syntax().text_range_without_outer_trivia(), + tree.syntax().text_without_outer_trivia().to_string(), + ); Some(()) } @@ -258,12 +295,17 @@ fn join_assignments( let lhs = bin_expr.lhs()?; let name_ref = expr_as_name_ref(&lhs)?; - if name_ref.to_string() != let_ident_pat.syntax().to_string() { + if name_ref.to_string() != let_ident_pat.syntax().text_without_outer_trivia().to_string() { cov_mark::hit!(join_assignments_mismatch); return None; } - edit.delete(let_stmt.semicolon_token()?.text_range().cover(lhs.syntax().text_range())); + edit.delete( + let_stmt + .semicolon_token()? + .text_range() + .cover(lhs.syntax().text_range_without_outer_trivia()), + ); Some(()) } diff --git a/crates/ide/src/moniker.rs b/crates/ide/src/moniker.rs index dd1c7379e790..812bfca44808 100644 --- a/crates/ide/src/moniker.rs +++ b/crates/ide/src/moniker.rs @@ -154,10 +154,8 @@ pub(crate) fn moniker( | T![super] | T![crate] | T![Self] - | COMMENT | INNER_DOC_COMMENT | OUTER_DOC_COMMENT => 2, - kind if kind.is_trivia() => 0, _ => 1, })?; if let Some(doc_comment) = token_as_doc_comment(&original_token) { diff --git a/crates/ide/src/move_item.rs b/crates/ide/src/move_item.rs index 1e628f4e9707..4dc499f6d8a4 100644 --- a/crates/ide/src/move_item.rs +++ b/crates/ide/src/move_item.rs @@ -1,7 +1,6 @@ use std::{iter::once, mem}; use hir::Semantics; -use ide_db::syntax_helpers::tree_diff::diff; use ide_db::text_edit::{TextEdit, TextEditBuilder}; use ide_db::{FileRange, RootDatabase, helpers::pick_best_token}; use itertools::Itertools; @@ -36,7 +35,6 @@ pub(crate) fn move_item( file.syntax().token_at_offset(range.range.start()), |kind| match kind { SyntaxKind::IDENT | SyntaxKind::LIFETIME_IDENT => 2, - kind if kind.is_trivia() => 0, _ => 1, }, )?) @@ -120,8 +118,8 @@ fn swap_sibling_in_list>( direction: Direction, ) -> Option { let list_lookup = list.array_windows().find(|[l, r]| match direction { - Direction::Up => r.syntax().text_range().contains_range(range), - Direction::Down => l.syntax().text_range().contains_range(range), + Direction::Up => r.syntax().text_range_without_outer_trivia().contains_range(range), + Direction::Down => l.syntax().text_range_without_outer_trivia().contains_range(range), }); if let Some([l, r]) = list_lookup { @@ -139,33 +137,63 @@ fn replace_nodes<'a>( mut first: &'a SyntaxNode, mut second: &'a SyntaxNode, ) -> TextEdit { - let cursor_offset = if range.is_empty() { + let with_attached_comments = |node: &SyntaxNode| { + let core = node.text_range_without_outer_trivia(); + let mut start = core.start(); + let mut newlines = 0; + for trivia_token in node + .first_non_trivia_token() + .into_iter() + .flat_map(|it| it.leading_trivia()) + .collect::>() + .into_iter() + .rev() + { + match trivia_token.kind() { + SyntaxKind::NEWLINE if newlines == 1 => break, + SyntaxKind::NEWLINE => newlines += 1, + SyntaxKind::COMMENT => { + start = trivia_token.text_range().start(); + newlines = 0; + } + _ => (), + } + } + TextRange::new(start, core.end()) + }; + let text = |node: &SyntaxNode, range: TextRange| { + node.text().slice(range - node.text_range().start()).to_string() + }; + + let cursor = if range.is_empty() { // FIXME: `applySnippetTextEdits` does not support non-empty selection ranges - if first.text_range().contains_range(range) { - Some(range.start() - first.text_range().start()) - } else if second.text_range().contains_range(range) { + if first.text_range_without_outer_trivia().contains_range(range) { + Some(range.start()) + } else if second.text_range_without_outer_trivia().contains_range(range) { mem::swap(&mut first, &mut second); - Some(range.start() - first.text_range().start()) + Some(range.start()) } else { None } } else { None }; + let first_range = with_attached_comments(first); + let second_range = with_attached_comments(second); - let first_with_cursor = match cursor_offset { - Some(offset) => { - let mut item_text = first.text().to_string(); - item_text.insert_str(offset.into(), "$0"); + let first_with_cursor = match cursor { + Some(cursor) => { + let mut item_text = text(first, first_range); + item_text.insert_str((cursor - first_range.start()).into(), "$0"); item_text } - None => first.text().to_string(), + None => text(first, first_range), }; let mut edit = TextEditBuilder::default(); - diff(first, second).into_text_edit(&mut edit); - edit.replace(second.text_range(), first_with_cursor); + edit.replace(first_range, text(second, second_range)); + edit.replace(second_range, first_with_cursor); edit.finish() } diff --git a/crates/ide/src/navigation_target.rs b/crates/ide/src/navigation_target.rs index c3d620a35700..fc4b60973924 100644 --- a/crates/ide/src/navigation_target.rs +++ b/crates/ide/src/navigation_target.rs @@ -445,7 +445,11 @@ where ( full_range, node.and_then(|node| { - Some(ast::HasName::name(&node)?.syntax().text_range()) + Some( + ast::HasName::name(&node)? + .syntax() + .text_range_without_outer_trivia(), + ) }), ) }), @@ -474,11 +478,19 @@ impl ToNav for hir::Module { }; let kind = if self.is_crate_root(db) { SymbolKind::CrateRoot } else { SymbolKind::Module }; - orig_range_with_focus(db, file_id, syntax, focus).map( - |(FileRange { file_id, range: full_range }, focus_range)| { - NavigationTarget::from_syntax(file_id, name.clone(), focus_range, full_range, kind) - }, + let range = match &value { + ModuleSource::SourceFile(_) => syntax.text_range(), + _ => syntax.text_range_without_outer_trivia(), + }; + orig_range_with_focus_r( + db, + file_id, + range, + focus.map(|it| it.syntax().text_range_without_outer_trivia()), ) + .map(|(FileRange { file_id, range: full_range }, focus_range)| { + NavigationTarget::from_syntax(file_id, name.clone(), focus_range, full_range, kind) + }) } } @@ -501,7 +513,9 @@ impl TryToNav for hir::Impl { db, file_id, full_range, - source.and_then(|source| Some(source.self_ty()?.syntax().text_range())), + source.and_then(|source| { + Some(source.self_ty()?.syntax().text_range_without_outer_trivia()) + }), ) .map(|(FileRange { file_id, range: full_range }, focus_range)| { NavigationTarget::from_syntax( @@ -901,11 +915,12 @@ fn orig_range_with_focus( value: &SyntaxNode, name: Option, ) -> UpmappingResult<(FileRange, Option)> { + let range = value.text_range_without_outer_trivia(); orig_range_with_focus_r( db, hir_file, - value.text_range(), - name.map(|it| it.syntax().text_range()), + range, + name.map(|it| it.syntax().text_range_without_outer_trivia()), ) } diff --git a/crates/ide/src/parent_module.rs b/crates/ide/src/parent_module.rs index 509ec2ab4051..7f8a245e519e 100644 --- a/crates/ide/src/parent_module.rs +++ b/crates/ide/src/parent_module.rs @@ -30,9 +30,9 @@ pub(crate) fn parent_module(db: &RootDatabase, position: FilePosition) -> Vec { - let offset = rename.syntax().text_range(); + let offset = rename.syntax().text_range_without_outer_trivia(); builder.replace(offset, format!("as {new_name}")); } None => { - let offset = use_tree.syntax().text_range().end(); + let offset = use_tree.syntax().text_range_without_outer_trivia().end(); builder.insert(offset, format!(" as {new_name}")); } } @@ -454,13 +454,13 @@ fn transform_assoc_fn_into_method_call( let self_needs_parens = self_arg.precedence().needs_parentheses_in(ExprPrecedence::Postfix); - let replace_start = path.syntax().text_range().start(); + let replace_start = path.syntax().text_range_without_outer_trivia().start(); let replace_end = match second_arg { - Some(second_arg) => second_arg.syntax().text_range().start(), + Some(second_arg) => second_arg.syntax().text_range_without_outer_trivia().start(), None => arg_list .r_paren_token() .map(|it| it.text_range().start()) - .unwrap_or_else(|| arg_list.syntax().text_range().end()), + .unwrap_or_else(|| arg_list.syntax().text_range_without_outer_trivia().end()), }; let replace_range = TextRange::new(replace_start, replace_end); let macro_file = sema.hir_file_for(fn_name.syntax()); @@ -568,7 +568,10 @@ fn rename_to_self<'db>( })); source_change.insert_source_edit( file_id.original_file(sema.db).file_id(sema.db), - TextEdit::replace(param_source.syntax().text_range(), String::from(self_param)), + TextEdit::replace( + param_source.syntax().text_range_without_outer_trivia(), + String::from(self_param), + ), ); transform_assoc_fn_into_method_call(sema, &mut source_change, fn_def); Ok(source_change) @@ -660,12 +663,12 @@ fn transform_method_call_into_assoc_fn( let self_needs_parens = self_adjust != CallReceiverAdjust::None && self_arg.precedence().needs_parentheses_in(ExprPrecedence::Prefix); - let replace_start = method_call.syntax().text_range().start(); + let replace_start = method_call.syntax().text_range_without_outer_trivia().start(); let replace_end = method_call .arg_list() .and_then(|it| it.l_paren_token()) .map(|it| it.text_range().end()) - .unwrap_or_else(|| method_call.syntax().text_range().end()); + .unwrap_or_else(|| method_call.syntax().text_range_without_outer_trivia().end()); let replace_range = TextRange::new(replace_start, replace_end); let macro_file = sema.hir_file_for(fn_name.syntax()); let Some((replace_range, _)) = @@ -816,7 +819,7 @@ fn text_edit_from_self_param(self_param: &ast::SelfParam, new_name: String) -> O replacement_text.push_str("Self"); - Some(TextEdit::replace(self_param.syntax().text_range(), replacement_text)) + Some(TextEdit::replace(self_param.syntax().text_range_without_outer_trivia(), replacement_text)) } fn rename_elided_lifetime( diff --git a/crates/ide/src/runnables.rs b/crates/ide/src/runnables.rs index 77d1d5a23f5a..ca07d9b42d44 100644 --- a/crates/ide/src/runnables.rs +++ b/crates/ide/src/runnables.rs @@ -287,7 +287,7 @@ fn find_related_tests_in_module( let mod_scope = SearchScope::file_range(hir::FileRange { file_id, range: mod_source.value }); let fn_pos = FilePosition { file_id: file_id.file_id(sema.db), - offset: fn_name.syntax().text_range().start(), + offset: fn_name.syntax().text_range_without_outer_trivia().start(), }; find_related_tests(sema, syntax, fn_pos, Some(mod_scope), tests) } diff --git a/crates/ide/src/signature_help.rs b/crates/ide/src/signature_help.rs index 0022c1148a14..e7a9f000c673 100644 --- a/crates/ide/src/signature_help.rs +++ b/crates/ide/src/signature_help.rs @@ -17,8 +17,8 @@ use itertools::Itertools; use span::Edition; use stdx::format_to; use syntax::{ - AstNode, Direction, NodeOrToken, SyntaxElementChildren, SyntaxNode, SyntaxToken, T, TextRange, - TextSize, ToSmolStr, algo, + AstNode, NodeOrToken, SyntaxElementChildren, SyntaxNode, SyntaxToken, T, TextRange, TextSize, + ToSmolStr, ast::{self, AstChildren}, match_ast, }; @@ -77,12 +77,10 @@ pub(crate) fn signature_help( let sema = Semantics::new(db); let file = sema.parse_guess_edition(file_id); let file = file.syntax(); - let token = file - .token_at_offset(offset) - .left_biased() - // if the cursor is sandwiched between two space tokens and the call is unclosed - // this prevents us from leaving the CallExpression - .and_then(|tok| algo::skip_trivia_token(tok, Direction::Prev))?; + let token = file.token_at_offset(offset).left_biased()?; + // if the cursor is sandwiched between two space tokens and the call is unclosed + // this prevents us from leaving the CallExpression + let token = if !token.is_trivia() { token } else { token.prev_non_trivia_token()? }; let token = sema.descend_into_macros_single_exact(token); let edition = sema.attach_first_edition(file_id).edition(db); let display_target = sema.first_crate(file_id)?.to_display_target(db); @@ -147,7 +145,7 @@ pub(crate) fn signature_help( // helpful inside them. if let Some(expr) = ast::Expr::cast(node.clone()) && !matches!(expr, ast::Expr::RecordExpr(..)) - && expr.syntax().text().contains_char('\n') + && expr.syntax().text_without_outer_trivia().contains_char('\n') { break; } @@ -704,8 +702,9 @@ fn signature_help_for_tuple_pat_ish<'db>( display_target: DisplayTarget, ) -> SignatureHelp { let rest_pat = field_pats.find(|it| matches!(it, ast::Pat::RestPat(_))); - let is_left_of_rest_pat = - rest_pat.is_none_or(|it| token.text_range().start() < it.syntax().text_range().end()); + let is_left_of_rest_pat = rest_pat.is_none_or(|it| { + token.text_range().start() < it.syntax().text_range_without_outer_trivia().end() + }); let commas = pat .children_with_tokens() diff --git a/crates/ide/src/syntax_highlighting.rs b/crates/ide/src/syntax_highlighting.rs index c29f18010163..07be7291776b 100644 --- a/crates/ide/src/syntax_highlighting.rs +++ b/crates/ide/src/syntax_highlighting.rs @@ -261,6 +261,21 @@ fn traverse( let mut body_stack: Vec> = vec![]; let mut per_body_cache: FxHashMap> = FxHashMap::default(); + let mut trivia_token = root.token_at_offset(range_to_highlight.start()).right_biased(); + while let Some(token) = + trivia_token.filter(|it| it.text_range().start() < range_to_highlight.end()) + { + let range = token.text_range(); + let mut highlight = HlTag::Comment.into(); + if token.kind() == syntax::SyntaxKind::COMMENT + && !range.is_empty() + && filter_by_config(&mut highlight, config) + { + hl.add(HlRange { range, highlight, binding_hash: None }); + } + trivia_token = token.next_token(); + } + // Walk all nodes, keeping track of whether we are inside a macro or not. // If in macro, expand it first and highlight the expanded code. let mut preorder = root.preorder_with_tokens(); @@ -268,7 +283,7 @@ fn traverse( use WalkEvent::{Enter, Leave}; let range = match &event { - Enter(it) | Leave(it) => it.text_range(), + Enter(it) | Leave(it) => it.text_range_without_outer_trivia(), }; // Element outside of the viewport, no need to highlight @@ -358,7 +373,6 @@ fn traverse( } let element = match event { - Enter(NodeOrToken::Token(tok)) if tok.kind() == WHITESPACE => continue, Enter(it) => it, Leave(NodeOrToken::Token(_)) => continue, Leave(NodeOrToken::Node(node)) => { diff --git a/crates/ide/src/typing.rs b/crates/ide/src/typing.rs index 79919dac5b19..7ccedc64d7aa 100644 --- a/crates/ide/src/typing.rs +++ b/crates/ide/src/typing.rs @@ -24,7 +24,7 @@ use std::iter; use syntax::{ AstNode, Parse, SourceFile, SyntaxKind, TextRange, TextSize, algo::{ancestors_at_offset, find_node_at_offset}, - ast::{self, AstToken, edit::IndentLevel}, + ast::{self, edit::IndentLevel}, }; use ide_db::text_edit::TextEdit; @@ -159,13 +159,16 @@ fn on_opening_delimiter_typed( fn on_left_brace_typed(reparsed: &SourceFile, offset: TextSize) -> Option { let segment: ast::PathSegment = find_node_at_offset(reparsed.syntax(), offset)?; - if segment.syntax().text_range().start() != offset { + if segment.syntax().text_range_without_outer_trivia().start() != offset { return None; } let tree: ast::UseTree = find_node_at_offset(reparsed.syntax(), offset)?; - Some(TextEdit::insert(tree.syntax().text_range().end() + TextSize::of("{"), "}".to_owned())) + Some(TextEdit::insert( + tree.syntax().text_range_without_outer_trivia().end() + TextSize::of("{"), + "}".to_owned(), + )) } fn on_delimited_node_typed( @@ -181,11 +184,11 @@ fn on_delimited_node_typed( } let (filter, node) = t .parent_ancestors() - .take_while(|n| n.text_range().start() == offset) + .take_while(|n| n.text_range_without_outer_trivia().start() == offset) .find_map(|n| kinds.iter().find(|&kind_filter| kind_filter(n.kind())).zip(Some(n)))?; let mut node = node .ancestors() - .take_while(|n| n.text_range().start() == offset && filter(n.kind())) + .take_while(|n| n.text_range_without_outer_trivia().start() == offset && filter(n.kind())) .last()?; if let Some(parent) = node.parent().filter(|it| filter(it.kind())) { @@ -193,9 +196,7 @@ fn on_delimited_node_typed( let mut node = node.clone(); loop { match node.prev_sibling() { - Some(sib) if sib.kind().is_trivia() || sib.kind() == SyntaxKind::ATTR => { - node = sib - } + Some(sib) if sib.kind() == SyntaxKind::ATTR => node = sib, Some(_) => break false, None => break true, }; @@ -209,7 +210,7 @@ fn on_delimited_node_typed( // Insert the closing bracket right after the node. Some(TextEdit::insert( - node.text_range().end() + TextSize::of(opening_bracket), + node.text_range_without_outer_trivia().end() + TextSize::of(opening_bracket), closing_bracket.to_string(), )) } @@ -256,14 +257,14 @@ fn on_eq_typed(file: &SourceFile, offset: TextSize) -> Option { } let expr = binop.rhs()?; - let expr_range = expr.syntax().text_range(); + let expr_range = expr.syntax().text_range_without_outer_trivia(); if expr_range.contains(offset) && offset != expr_range.start() { return None; } if file.syntax().text().slice(offset..expr_range.start()).contains_char('\n') { return None; } - let offset = expr.syntax().text_range().end(); + let offset = expr.syntax().text_range_without_outer_trivia().end(); Some(TextEdit::insert(offset, ";".to_owned())) } @@ -292,7 +293,7 @@ fn on_eq_typed(file: &SourceFile, offset: TextSize) -> Option { return None; } let expr = let_stmt.initializer()?; - let expr_range = expr.syntax().text_range(); + let expr_range = expr.syntax().text_range_without_outer_trivia(); if expr_range.contains(offset) && offset != expr_range.start() { return None; } @@ -303,26 +304,27 @@ fn on_eq_typed(file: &SourceFile, offset: TextSize) -> Option { if expr.syntax().descendants().any(|it| it.kind() == SyntaxKind::ERROR) { return None; } - let offset = let_stmt.syntax().text_range().end(); + let offset = let_stmt.syntax().text_range_without_outer_trivia().end(); Some(TextEdit::insert(offset, ";".to_owned())) } } /// Returns an edit which should be applied when a dot ('.') is typed on a blank line, indenting the line appropriately. fn on_dot_typed(file: &SourceFile, offset: TextSize) -> Option { - let whitespace = - file.syntax().token_at_offset(offset).left_biased().and_then(ast::Whitespace::cast)?; + let blank = file.syntax().token_at_offset(offset).left_biased()?; + if !matches!(blank.kind(), SyntaxKind::WHITESPACE | SyntaxKind::NEWLINE) { + return None; + } + + let run = syntax::algo::blank_run(&blank).range; + let run = file.syntax().text().slice(TextRange::new(run.start(), offset)).to_string(); // if prior is fn call over multiple lines dont indent // or if previous is method call over multiples lines keep that indent - let current_indent = { - let text = whitespace.text(); - let (_prefix, suffix) = text.rsplit_once('\n')?; - suffix - }; + let (_prefix, current_indent) = run.rsplit_once('\n')?; let current_indent_len = TextSize::of(current_indent); - let parent = whitespace.syntax().parent()?; + let parent = blank.owning_node()?; // Make sure dot is a part of call chain let receiver = if let Some(field_expr) = ast::FieldExpr::cast(parent.clone()) { field_expr.expr()? @@ -330,7 +332,8 @@ fn on_dot_typed(file: &SourceFile, offset: TextSize) -> Option { ast::MethodCallExpr::cast(parent.clone())?.receiver()? }; - let receiver_is_multiline = receiver.syntax().text().find_char('\n').is_some(); + let receiver_is_multiline = + receiver.syntax().text_without_outer_trivia().find_char('\n').is_some(); let target_indent = match (receiver, receiver_is_multiline) { // if receiver is multiline field or method call, just take the previous `.` indentation (ast::Expr::MethodCallExpr(expr), true) => { @@ -415,8 +418,9 @@ fn on_plus_typed(file: &SourceFile, offset: TextSize) -> Option { if ast::RefType::can_cast(kind) || ast::PtrType::can_cast(kind) || ast::RetType::can_cast(kind) { let mut builder = TextEdit::builder(); - builder.insert(trait_type.syntax().text_range().start(), "(".to_owned()); - builder.insert(trait_type.syntax().text_range().end(), ")".to_owned()); + builder + .insert(trait_type.syntax().text_range_without_outer_trivia().start(), "(".to_owned()); + builder.insert(trait_type.syntax().text_range_without_outer_trivia().end(), ")".to_owned()); Some(builder.finish()) } else { None diff --git a/crates/ide/src/typing/on_enter.rs b/crates/ide/src/typing/on_enter.rs index c4f53337b391..369eb53fa8d3 100644 --- a/crates/ide/src/typing/on_enter.rs +++ b/crates/ide/src/typing/on_enter.rs @@ -3,7 +3,7 @@ use ide_db::{FilePosition, RootDatabase, source_change::SnippetEdit}; use syntax::{ - AstNode, SmolStr, SourceFile, + AstNode, Direction, SmolStr, SourceFile, SyntaxKind::*, SyntaxToken, TextRange, TextSize, TokenAtOffset, ast::{self, AstToken, edit::IndentLevel}, @@ -90,7 +90,7 @@ fn on_enter_in_comment( if comment.text().ends_with(' ') { cov_mark::hit!(continues_end_of_line_comment_with_space); remove_trailing_whitespace = true; - } else if !followed_by_comment(comment) { + } else if syntax::algo::adjacent_comment(comment.syntax(), Direction::Next).is_none() { return None; } } @@ -128,7 +128,7 @@ fn brace_contents_on_same_line(l_curly: &SyntaxToken) -> Option<(SyntaxToken, St let mut token = l_curly.next_token()?; loop { - if token.kind() == WHITESPACE && token.text().contains('\n') { + if token.kind() == NEWLINE { return None; } @@ -159,17 +159,6 @@ fn brace_contents_on_same_line(l_curly: &SyntaxToken) -> Option<(SyntaxToken, St } } -fn followed_by_comment(comment: &ast::AnyComment) -> bool { - let ws = match comment.syntax().next_token().and_then(ast::Whitespace::cast) { - Some(it) => it, - None => return false, - }; - if ws.spans_multiple_lines() { - return false; - } - ws.syntax().next_token().and_then(ast::AnyComment::cast).is_some() -} - fn node_indent(file: &SourceFile, token: &SyntaxToken) -> Option { let ws = match file.syntax().token_at_offset(token.text_range().start()) { TokenAtOffset::Between(l, r) => { @@ -182,12 +171,11 @@ fn node_indent(file: &SourceFile, token: &SyntaxToken) -> Option { } TokenAtOffset::None => unreachable!(), }; - if ws.kind() != WHITESPACE { - return None; + match ws.kind() { + WHITESPACE => Some(ws.text().into()), + NEWLINE => Some("".into()), + _ => None, } - let text = ws.text(); - let pos = text.rfind('\n').map(|it| it + 1).unwrap_or(0); - Some(text[pos..].into()) } #[cfg(test)] diff --git a/crates/ide/src/view_syntax_tree.rs b/crates/ide/src/view_syntax_tree.rs index 7732b180829a..b155b2fccdea 100644 --- a/crates/ide/src/view_syntax_tree.rs +++ b/crates/ide/src/view_syntax_tree.rs @@ -30,72 +30,82 @@ pub(crate) fn view_syntax_tree(db: &RootDatabase, file_id: FileId) -> String { fn syntax_node_to_json(node: &SyntaxNode, ctx: &SyntaxTreeCtx) -> String { let mut result = String::new(); - for event in node.preorder_with_tokens() { - match event { - WalkEvent::Enter(it) => { - let kind = it.kind(); - let (text_range, inner_range_str) = match &ctx.in_string { - Some(in_string) => { - let start_pos = TextPosition::new(&ctx.line_index, it.text_range().start()); - let end_pos = TextPosition::new(&ctx.line_index, it.text_range().end()); - - let inner_start: u32 = it.text_range().start().into(); - let inner_end: u32 = it.text_range().start().into(); - - let mut true_start = inner_start + in_string.offset; - let mut true_end = inner_end + in_string.offset; - for pos in &in_string.marker_positions { - if *pos >= inner_end { - break; - } - - // We conditionally add to true_start in case - // the marker is between the start and end. - true_start += 2 * (*pos < inner_start) as u32; - true_end += 2; - } + let positions = |range: TextRange| { + let (text_range, inner_range_str) = match &ctx.in_string { + Some(in_string) => { + let start_pos = TextPosition::new(&ctx.line_index, range.start()); + let end_pos = TextPosition::new(&ctx.line_index, range.end()); + + let inner_start: u32 = range.start().into(); + let inner_end: u32 = range.start().into(); + + let mut true_start = inner_start + in_string.offset; + let mut true_end = inner_end + in_string.offset; + for pos in &in_string.marker_positions { + if *pos >= inner_end { + break; + } - let true_range = TextRange::new(true_start.into(), true_end.into()); + // We conditionally add to true_start in case + // the marker is between the start and end. + true_start += 2 * (*pos < inner_start) as u32; + true_end += 2; + } - (true_range, format!(r#","istart":{start_pos},"iend":{end_pos}"#,)) - } - None => (it.text_range(), "".to_owned()), - }; + let true_range = TextRange::new(true_start.into(), true_end.into()); - let start = TextPosition::new(&ctx.line_index, text_range.start()); - let end = TextPosition::new(&ctx.line_index, text_range.end()); + (true_range, format!(r#","istart":{start_pos},"iend":{end_pos}"#,)) + } + None => (range, "".to_owned()), + }; - match it { - NodeOrToken::Node(_) => { - format_to!( - result, - r#"{{"type":"Node","kind":"{kind:?}","start":{start},"end":{end}{inner_range_str},"children":["# - ); - } - NodeOrToken::Token(token) => { - let comma = if token.next_sibling_or_token().is_some() { "," } else { "" }; - match parse_rust_string(token, ctx) { - Some(parsed) => { - format_to!( - result, - r#"{{"type":"Node","kind":"{kind:?}","start":{start},"end":{end}{inner_range_str},"children":[{parsed}]}}{comma}"# - ); - } - None => format_to!( + let start = TextPosition::new(&ctx.line_index, text_range.start()); + let end = TextPosition::new(&ctx.line_index, text_range.end()); + (start, end, inner_range_str) + }; + for event in node.preorder_with_tokens() { + match event { + WalkEvent::Enter(NodeOrToken::Node(node)) => { + let kind = node.kind(); + let (start, end, inner_range_str) = positions(node.text_range()); + format_to!( + result, + r#"{{"type":"Node","kind":"{kind:?}","start":{start},"end":{end}{inner_range_str},"children":["# + ); + } + WalkEvent::Enter(NodeOrToken::Token(token)) => { + let has_next = token.next_sibling_or_token().is_some(); + let trailing = token.trailing_trivia().len(); + let trivia = token + .leading_trivia() + .map(|trivia_token| (trivia_token, true)) + .chain(std::iter::once((token.clone(), trailing > 0 || has_next))) + .chain(token.trailing_trivia().enumerate().map(|(index, trivia_token)| { + (trivia_token, index + 1 < trailing || has_next) + })); + for (trivia_token, followed) in trivia { + let kind = trivia_token.kind(); + let (start, end, inner_range_str) = positions(trivia_token.text_range()); + let comma = if followed { "," } else { "" }; + match parse_rust_string(trivia_token, ctx) { + Some(parsed) => { + format_to!( result, - r#"{{"type":"Token","kind":"{kind:?}","start":{start},"end":{end}{inner_range_str}}}{comma}"# - ), + r#"{{"type":"Node","kind":"{kind:?}","start":{start},"end":{end}{inner_range_str},"children":[{parsed}]}}{comma}"# + ); } + None => format_to!( + result, + r#"{{"type":"Token","kind":"{kind:?}","start":{start},"end":{end}{inner_range_str}}}{comma}"# + ), } } } - WalkEvent::Leave(it) => match it { - NodeOrToken::Node(node) => { - let comma = if node.next_sibling_or_token().is_some() { "," } else { "" }; - format_to!(result, "]}}{comma}") - } - NodeOrToken::Token(_) => (), - }, + WalkEvent::Leave(NodeOrToken::Node(node)) => { + let comma = if node.next_sibling_or_token().is_some() { "," } else { "" }; + format_to!(result, "]}}{comma}") + } + WalkEvent::Leave(NodeOrToken::Token(_)) => (), } } @@ -189,7 +199,7 @@ mod tests { check( r#"fn foo() {}"#, expect![[ - r#"{"type":"Node","kind":"SOURCE_FILE","start":[0,0,0],"end":[11,0,11],"children":[{"type":"Node","kind":"FN","start":[0,0,0],"end":[11,0,11],"children":[{"type":"Token","kind":"FN_KW","start":[0,0,0],"end":[2,0,2]},{"type":"Token","kind":"WHITESPACE","start":[2,0,2],"end":[3,0,3]},{"type":"Node","kind":"NAME","start":[3,0,3],"end":[6,0,6],"children":[{"type":"Token","kind":"IDENT","start":[3,0,3],"end":[6,0,6]}]},{"type":"Node","kind":"PARAM_LIST","start":[6,0,6],"end":[8,0,8],"children":[{"type":"Token","kind":"L_PAREN","start":[6,0,6],"end":[7,0,7]},{"type":"Token","kind":"R_PAREN","start":[7,0,7],"end":[8,0,8]}]},{"type":"Token","kind":"WHITESPACE","start":[8,0,8],"end":[9,0,9]},{"type":"Node","kind":"BLOCK_EXPR","start":[9,0,9],"end":[11,0,11],"children":[{"type":"Node","kind":"STMT_LIST","start":[9,0,9],"end":[11,0,11],"children":[{"type":"Token","kind":"L_CURLY","start":[9,0,9],"end":[10,0,10]},{"type":"Token","kind":"R_CURLY","start":[10,0,10],"end":[11,0,11]}]}]}]}]}"# + r#"{"type":"Node","kind":"SOURCE_FILE","start":[0,0,0],"end":[11,0,11],"children":[{"type":"Node","kind":"FN","start":[0,0,0],"end":[11,0,11],"children":[{"type":"Token","kind":"FN_KW","start":[0,0,0],"end":[2,0,2]},{"type":"Token","kind":"WHITESPACE","start":[2,0,2],"end":[3,0,3]},{"type":"Node","kind":"NAME","start":[3,0,3],"end":[6,0,6],"children":[{"type":"Token","kind":"IDENT","start":[3,0,3],"end":[6,0,6]}]},{"type":"Node","kind":"PARAM_LIST","start":[6,0,6],"end":[9,0,9],"children":[{"type":"Token","kind":"L_PAREN","start":[6,0,6],"end":[7,0,7]},{"type":"Token","kind":"R_PAREN","start":[7,0,7],"end":[8,0,8]},{"type":"Token","kind":"WHITESPACE","start":[8,0,8],"end":[9,0,9]}]},{"type":"Node","kind":"BLOCK_EXPR","start":[9,0,9],"end":[11,0,11],"children":[{"type":"Node","kind":"STMT_LIST","start":[9,0,9],"end":[11,0,11],"children":[{"type":"Token","kind":"L_CURLY","start":[9,0,9],"end":[10,0,10]},{"type":"Token","kind":"R_CURLY","start":[10,0,10],"end":[11,0,11]}]}]}]},{"type":"Token","kind":"EOF","start":[11,0,11],"end":[11,0,11]}]}"# ]], ); @@ -202,7 +212,7 @@ fn test() { ", ""); }"#, expect![[ - r#"{"type":"Node","kind":"SOURCE_FILE","start":[0,0,0],"end":[60,5,1],"children":[{"type":"Node","kind":"FN","start":[0,0,0],"end":[60,5,1],"children":[{"type":"Token","kind":"FN_KW","start":[0,0,0],"end":[2,0,2]},{"type":"Token","kind":"WHITESPACE","start":[2,0,2],"end":[3,0,3]},{"type":"Node","kind":"NAME","start":[3,0,3],"end":[7,0,7],"children":[{"type":"Token","kind":"IDENT","start":[3,0,3],"end":[7,0,7]}]},{"type":"Node","kind":"PARAM_LIST","start":[7,0,7],"end":[9,0,9],"children":[{"type":"Token","kind":"L_PAREN","start":[7,0,7],"end":[8,0,8]},{"type":"Token","kind":"R_PAREN","start":[8,0,8],"end":[9,0,9]}]},{"type":"Token","kind":"WHITESPACE","start":[9,0,9],"end":[10,0,10]},{"type":"Node","kind":"BLOCK_EXPR","start":[10,0,10],"end":[60,5,1],"children":[{"type":"Node","kind":"STMT_LIST","start":[10,0,10],"end":[60,5,1],"children":[{"type":"Token","kind":"L_CURLY","start":[10,0,10],"end":[11,0,11]},{"type":"Token","kind":"WHITESPACE","start":[11,0,11],"end":[16,1,4]},{"type":"Node","kind":"EXPR_STMT","start":[16,1,4],"end":[58,4,11],"children":[{"type":"Node","kind":"MACRO_EXPR","start":[16,1,4],"end":[57,4,10],"children":[{"type":"Node","kind":"MACRO_CALL","start":[16,1,4],"end":[57,4,10],"children":[{"type":"Node","kind":"PATH","start":[16,1,4],"end":[22,1,10],"children":[{"type":"Node","kind":"PATH_SEGMENT","start":[16,1,4],"end":[22,1,10],"children":[{"type":"Node","kind":"NAME_REF","start":[16,1,4],"end":[22,1,10],"children":[{"type":"Token","kind":"IDENT","start":[16,1,4],"end":[22,1,10]}]}]}]},{"type":"Token","kind":"BANG","start":[22,1,10],"end":[23,1,11]},{"type":"Node","kind":"TOKEN_TREE","start":[23,1,11],"end":[57,4,10],"children":[{"type":"Token","kind":"L_PAREN","start":[23,1,11],"end":[24,1,12]},{"type":"Node","kind":"STRING","start":[24,1,12],"end":[52,4,5],"children":[{"type":"Node","kind":"SOURCE_FILE","start":[25,1,13],"end":[25,1,13],"istart":[0,0,0],"iend":[26,2,0],"children":[{"type":"Token","kind":"WHITESPACE","start":[25,1,13],"end":[25,1,13],"istart":[0,0,0],"iend":[5,0,5]},{"type":"Node","kind":"FN","start":[30,2,4],"end":[30,2,4],"istart":[5,0,5],"iend":[21,1,9],"children":[{"type":"Token","kind":"FN_KW","start":[30,2,4],"end":[30,2,4],"istart":[5,0,5],"iend":[7,0,7]},{"type":"Token","kind":"WHITESPACE","start":[32,2,6],"end":[32,2,6],"istart":[7,0,7],"iend":[8,0,8]},{"type":"Node","kind":"NAME","start":[33,2,7],"end":[33,2,7],"istart":[8,0,8],"iend":[11,0,11],"children":[{"type":"Token","kind":"IDENT","start":[33,2,7],"end":[33,2,7],"istart":[8,0,8],"iend":[11,0,11]}]},{"type":"Node","kind":"PARAM_LIST","start":[36,2,10],"end":[36,2,10],"istart":[11,0,11],"iend":[13,1,1],"children":[{"type":"Token","kind":"L_PAREN","start":[36,2,10],"end":[36,2,10],"istart":[11,0,11],"iend":[12,1,0]},{"type":"Token","kind":"R_PAREN","start":[37,2,11],"end":[37,2,11],"istart":[12,1,0],"iend":[13,1,1]}]},{"type":"Token","kind":"WHITESPACE","start":[38,2,12],"end":[38,2,12],"istart":[13,1,1],"iend":[14,1,2]},{"type":"Node","kind":"BLOCK_EXPR","start":[39,2,13],"end":[39,2,13],"istart":[14,1,2],"iend":[21,1,9],"children":[{"type":"Node","kind":"STMT_LIST","start":[39,2,13],"end":[39,2,13],"istart":[14,1,2],"iend":[21,1,9],"children":[{"type":"Token","kind":"L_CURLY","start":[39,2,13],"end":[39,2,13],"istart":[14,1,2],"iend":[15,1,3]},{"type":"Token","kind":"WHITESPACE","start":[40,2,14],"end":[40,2,14],"istart":[15,1,3],"iend":[20,1,8]},{"type":"Token","kind":"R_CURLY","start":[45,3,4],"end":[45,3,4],"istart":[20,1,8],"iend":[21,1,9]}]}]}]},{"type":"Token","kind":"WHITESPACE","start":[46,3,5],"end":[46,3,5],"istart":[21,1,9],"iend":[26,2,0]}]}]},{"type":"Token","kind":"COMMA","start":[52,4,5],"end":[53,4,6]},{"type":"Token","kind":"WHITESPACE","start":[53,4,6],"end":[54,4,7]},{"type":"Token","kind":"STRING","start":[54,4,7],"end":[56,4,9]},{"type":"Token","kind":"R_PAREN","start":[56,4,9],"end":[57,4,10]}]}]}]},{"type":"Token","kind":"SEMICOLON","start":[57,4,10],"end":[58,4,11]}]},{"type":"Token","kind":"WHITESPACE","start":[58,4,11],"end":[59,5,0]},{"type":"Token","kind":"R_CURLY","start":[59,5,0],"end":[60,5,1]}]}]}]}]}"# + r#"{"type":"Node","kind":"SOURCE_FILE","start":[0,0,0],"end":[60,5,1],"children":[{"type":"Node","kind":"FN","start":[0,0,0],"end":[60,5,1],"children":[{"type":"Token","kind":"FN_KW","start":[0,0,0],"end":[2,0,2]},{"type":"Token","kind":"WHITESPACE","start":[2,0,2],"end":[3,0,3]},{"type":"Node","kind":"NAME","start":[3,0,3],"end":[7,0,7],"children":[{"type":"Token","kind":"IDENT","start":[3,0,3],"end":[7,0,7]}]},{"type":"Node","kind":"PARAM_LIST","start":[7,0,7],"end":[10,0,10],"children":[{"type":"Token","kind":"L_PAREN","start":[7,0,7],"end":[8,0,8]},{"type":"Token","kind":"R_PAREN","start":[8,0,8],"end":[9,0,9]},{"type":"Token","kind":"WHITESPACE","start":[9,0,9],"end":[10,0,10]}]},{"type":"Node","kind":"BLOCK_EXPR","start":[10,0,10],"end":[60,5,1],"children":[{"type":"Node","kind":"STMT_LIST","start":[10,0,10],"end":[60,5,1],"children":[{"type":"Token","kind":"L_CURLY","start":[10,0,10],"end":[11,0,11]},{"type":"Token","kind":"NEWLINE","start":[11,0,11],"end":[12,1,0]},{"type":"Node","kind":"EXPR_STMT","start":[12,1,0],"end":[59,5,0],"children":[{"type":"Node","kind":"MACRO_EXPR","start":[12,1,0],"end":[57,4,10],"children":[{"type":"Node","kind":"MACRO_CALL","start":[12,1,0],"end":[57,4,10],"children":[{"type":"Node","kind":"PATH","start":[12,1,0],"end":[22,1,10],"children":[{"type":"Node","kind":"PATH_SEGMENT","start":[12,1,0],"end":[22,1,10],"children":[{"type":"Node","kind":"NAME_REF","start":[12,1,0],"end":[22,1,10],"children":[{"type":"Token","kind":"WHITESPACE","start":[12,1,0],"end":[16,1,4]},{"type":"Token","kind":"IDENT","start":[16,1,4],"end":[22,1,10]}]}]}]},{"type":"Token","kind":"BANG","start":[22,1,10],"end":[23,1,11]},{"type":"Node","kind":"TOKEN_TREE","start":[23,1,11],"end":[57,4,10],"children":[{"type":"Token","kind":"L_PAREN","start":[23,1,11],"end":[24,1,12]},{"type":"Node","kind":"STRING","start":[24,1,12],"end":[52,4,5],"children":[{"type":"Node","kind":"SOURCE_FILE","start":[25,1,13],"end":[25,1,13],"istart":[0,0,0],"iend":[26,2,0],"children":[{"type":"Node","kind":"FN","start":[25,1,13],"end":[25,1,13],"istart":[0,0,0],"iend":[22,1,10],"children":[{"type":"Token","kind":"NEWLINE","start":[25,1,13],"end":[25,1,13],"istart":[0,0,0],"iend":[1,0,1]},{"type":"Token","kind":"WHITESPACE","start":[26,2,0],"end":[26,2,0],"istart":[1,0,1],"iend":[5,0,5]},{"type":"Token","kind":"FN_KW","start":[30,2,4],"end":[30,2,4],"istart":[5,0,5],"iend":[7,0,7]},{"type":"Token","kind":"WHITESPACE","start":[32,2,6],"end":[32,2,6],"istart":[7,0,7],"iend":[8,0,8]},{"type":"Node","kind":"NAME","start":[33,2,7],"end":[33,2,7],"istart":[8,0,8],"iend":[11,0,11],"children":[{"type":"Token","kind":"IDENT","start":[33,2,7],"end":[33,2,7],"istart":[8,0,8],"iend":[11,0,11]}]},{"type":"Node","kind":"PARAM_LIST","start":[36,2,10],"end":[36,2,10],"istart":[11,0,11],"iend":[14,1,2],"children":[{"type":"Token","kind":"L_PAREN","start":[36,2,10],"end":[36,2,10],"istart":[11,0,11],"iend":[12,1,0]},{"type":"Token","kind":"R_PAREN","start":[37,2,11],"end":[37,2,11],"istart":[12,1,0],"iend":[13,1,1]},{"type":"Token","kind":"WHITESPACE","start":[38,2,12],"end":[38,2,12],"istart":[13,1,1],"iend":[14,1,2]}]},{"type":"Node","kind":"BLOCK_EXPR","start":[39,2,13],"end":[39,2,13],"istart":[14,1,2],"iend":[22,1,10],"children":[{"type":"Node","kind":"STMT_LIST","start":[39,2,13],"end":[39,2,13],"istart":[14,1,2],"iend":[22,1,10],"children":[{"type":"Token","kind":"L_CURLY","start":[39,2,13],"end":[39,2,13],"istart":[14,1,2],"iend":[15,1,3]},{"type":"Token","kind":"NEWLINE","start":[40,2,14],"end":[40,2,14],"istart":[15,1,3],"iend":[16,1,4]},{"type":"Token","kind":"WHITESPACE","start":[41,3,0],"end":[41,3,0],"istart":[16,1,4],"iend":[20,1,8]},{"type":"Token","kind":"R_CURLY","start":[45,3,4],"end":[45,3,4],"istart":[20,1,8],"iend":[21,1,9]},{"type":"Token","kind":"NEWLINE","start":[46,3,5],"end":[46,3,5],"istart":[21,1,9],"iend":[22,1,10]}]}]}]},{"type":"Token","kind":"WHITESPACE","start":[47,4,0],"end":[47,4,0],"istart":[22,1,10],"iend":[26,2,0]},{"type":"Token","kind":"EOF","start":[51,4,4],"end":[51,4,4],"istart":[26,2,0],"iend":[26,2,0]}]}]},{"type":"Token","kind":"COMMA","start":[52,4,5],"end":[53,4,6]},{"type":"Token","kind":"WHITESPACE","start":[53,4,6],"end":[54,4,7]},{"type":"Token","kind":"STRING","start":[54,4,7],"end":[56,4,9]},{"type":"Token","kind":"R_PAREN","start":[56,4,9],"end":[57,4,10]}]}]}]},{"type":"Token","kind":"SEMICOLON","start":[57,4,10],"end":[58,4,11]},{"type":"Token","kind":"NEWLINE","start":[58,4,11],"end":[59,5,0]}]},{"type":"Token","kind":"R_CURLY","start":[59,5,0],"end":[60,5,1]}]}]}]},{"type":"Token","kind":"EOF","start":[60,5,1],"end":[60,5,1]}]}"# ]], ) } @@ -219,7 +229,7 @@ fn bar() { ", ""); }"#, expect![[ - r#"{"type":"Node","kind":"SOURCE_FILE","start":[0,0,0],"end":[65,7,1],"children":[{"type":"Node","kind":"FN","start":[0,0,0],"end":[65,7,1],"children":[{"type":"Token","kind":"FN_KW","start":[0,0,0],"end":[2,0,2]},{"type":"Token","kind":"WHITESPACE","start":[2,0,2],"end":[3,0,3]},{"type":"Node","kind":"NAME","start":[3,0,3],"end":[7,0,7],"children":[{"type":"Token","kind":"IDENT","start":[3,0,3],"end":[7,0,7]}]},{"type":"Node","kind":"PARAM_LIST","start":[7,0,7],"end":[9,0,9],"children":[{"type":"Token","kind":"L_PAREN","start":[7,0,7],"end":[8,0,8]},{"type":"Token","kind":"R_PAREN","start":[8,0,8],"end":[9,0,9]}]},{"type":"Token","kind":"WHITESPACE","start":[9,0,9],"end":[10,0,10]},{"type":"Node","kind":"BLOCK_EXPR","start":[10,0,10],"end":[65,7,1],"children":[{"type":"Node","kind":"STMT_LIST","start":[10,0,10],"end":[65,7,1],"children":[{"type":"Token","kind":"L_CURLY","start":[10,0,10],"end":[11,0,11]},{"type":"Token","kind":"WHITESPACE","start":[11,0,11],"end":[16,1,4]},{"type":"Node","kind":"EXPR_STMT","start":[16,1,4],"end":[63,6,11],"children":[{"type":"Node","kind":"MACRO_EXPR","start":[16,1,4],"end":[62,6,10],"children":[{"type":"Node","kind":"MACRO_CALL","start":[16,1,4],"end":[62,6,10],"children":[{"type":"Node","kind":"PATH","start":[16,1,4],"end":[22,1,10],"children":[{"type":"Node","kind":"PATH_SEGMENT","start":[16,1,4],"end":[22,1,10],"children":[{"type":"Node","kind":"NAME_REF","start":[16,1,4],"end":[22,1,10],"children":[{"type":"Token","kind":"IDENT","start":[16,1,4],"end":[22,1,10]}]}]}]},{"type":"Token","kind":"BANG","start":[22,1,10],"end":[23,1,11]},{"type":"Node","kind":"TOKEN_TREE","start":[23,1,11],"end":[62,6,10],"children":[{"type":"Token","kind":"L_PAREN","start":[23,1,11],"end":[24,1,12]},{"type":"Node","kind":"STRING","start":[24,1,12],"end":[57,6,5],"children":[{"type":"Node","kind":"SOURCE_FILE","start":[25,1,13],"end":[25,1,13],"istart":[0,0,0],"iend":[31,2,5],"children":[{"type":"Token","kind":"WHITESPACE","start":[25,1,13],"end":[25,1,13],"istart":[0,0,0],"iend":[1,0,1]},{"type":"Node","kind":"FN","start":[26,2,0],"end":[26,2,0],"istart":[1,0,1],"iend":[13,1,1],"children":[{"type":"Token","kind":"FN_KW","start":[26,2,0],"end":[26,2,0],"istart":[1,0,1],"iend":[3,0,3]},{"type":"Token","kind":"WHITESPACE","start":[28,2,2],"end":[28,2,2],"istart":[3,0,3],"iend":[4,0,4]},{"type":"Node","kind":"NAME","start":[29,2,3],"end":[29,2,3],"istart":[4,0,4],"iend":[7,0,7],"children":[{"type":"Token","kind":"IDENT","start":[29,2,3],"end":[29,2,3],"istart":[4,0,4],"iend":[7,0,7]}]},{"type":"Node","kind":"PARAM_LIST","start":[32,2,6],"end":[32,2,6],"istart":[7,0,7],"iend":[9,0,9],"children":[{"type":"Token","kind":"L_PAREN","start":[32,2,6],"end":[32,2,6],"istart":[7,0,7],"iend":[8,0,8]},{"type":"Token","kind":"R_PAREN","start":[33,2,7],"end":[33,2,7],"istart":[8,0,8],"iend":[9,0,9]}]},{"type":"Token","kind":"WHITESPACE","start":[34,2,8],"end":[34,2,8],"istart":[9,0,9],"iend":[10,0,10]},{"type":"Node","kind":"BLOCK_EXPR","start":[35,2,9],"end":[35,2,9],"istart":[10,0,10],"iend":[13,1,1],"children":[{"type":"Node","kind":"STMT_LIST","start":[35,2,9],"end":[35,2,9],"istart":[10,0,10],"iend":[13,1,1],"children":[{"type":"Token","kind":"L_CURLY","start":[35,2,9],"end":[35,2,9],"istart":[10,0,10],"iend":[11,0,11]},{"type":"Token","kind":"WHITESPACE","start":[36,2,10],"end":[36,2,10],"istart":[11,0,11],"iend":[12,1,0]},{"type":"Token","kind":"R_CURLY","start":[37,3,0],"end":[37,3,0],"istart":[12,1,0],"iend":[13,1,1]}]}]}]},{"type":"Token","kind":"WHITESPACE","start":[38,3,1],"end":[38,3,1],"istart":[13,1,1],"iend":[14,1,2]},{"type":"Node","kind":"FN","start":[39,4,0],"end":[39,4,0],"istart":[14,1,2],"iend":[26,2,0],"children":[{"type":"Token","kind":"FN_KW","start":[39,4,0],"end":[39,4,0],"istart":[14,1,2],"iend":[16,1,4]},{"type":"Token","kind":"WHITESPACE","start":[41,4,2],"end":[41,4,2],"istart":[16,1,4],"iend":[17,1,5]},{"type":"Node","kind":"NAME","start":[42,4,3],"end":[42,4,3],"istart":[17,1,5],"iend":[20,1,8],"children":[{"type":"Token","kind":"IDENT","start":[42,4,3],"end":[42,4,3],"istart":[17,1,5],"iend":[20,1,8]}]},{"type":"Node","kind":"PARAM_LIST","start":[45,4,6],"end":[45,4,6],"istart":[20,1,8],"iend":[22,1,10],"children":[{"type":"Token","kind":"L_PAREN","start":[45,4,6],"end":[45,4,6],"istart":[20,1,8],"iend":[21,1,9]},{"type":"Token","kind":"R_PAREN","start":[46,4,7],"end":[46,4,7],"istart":[21,1,9],"iend":[22,1,10]}]},{"type":"Token","kind":"WHITESPACE","start":[47,4,8],"end":[47,4,8],"istart":[22,1,10],"iend":[23,1,11]},{"type":"Node","kind":"BLOCK_EXPR","start":[48,4,9],"end":[48,4,9],"istart":[23,1,11],"iend":[26,2,0],"children":[{"type":"Node","kind":"STMT_LIST","start":[48,4,9],"end":[48,4,9],"istart":[23,1,11],"iend":[26,2,0],"children":[{"type":"Token","kind":"L_CURLY","start":[48,4,9],"end":[48,4,9],"istart":[23,1,11],"iend":[24,1,12]},{"type":"Token","kind":"WHITESPACE","start":[49,4,10],"end":[49,4,10],"istart":[24,1,12],"iend":[25,1,13]},{"type":"Token","kind":"R_CURLY","start":[50,5,0],"end":[50,5,0],"istart":[25,1,13],"iend":[26,2,0]}]}]}]},{"type":"Token","kind":"WHITESPACE","start":[51,5,1],"end":[51,5,1],"istart":[26,2,0],"iend":[31,2,5]}]}]},{"type":"Token","kind":"COMMA","start":[57,6,5],"end":[58,6,6]},{"type":"Token","kind":"WHITESPACE","start":[58,6,6],"end":[59,6,7]},{"type":"Token","kind":"STRING","start":[59,6,7],"end":[61,6,9]},{"type":"Token","kind":"R_PAREN","start":[61,6,9],"end":[62,6,10]}]}]}]},{"type":"Token","kind":"SEMICOLON","start":[62,6,10],"end":[63,6,11]}]},{"type":"Token","kind":"WHITESPACE","start":[63,6,11],"end":[64,7,0]},{"type":"Token","kind":"R_CURLY","start":[64,7,0],"end":[65,7,1]}]}]}]}]}"# + r#"{"type":"Node","kind":"SOURCE_FILE","start":[0,0,0],"end":[65,7,1],"children":[{"type":"Node","kind":"FN","start":[0,0,0],"end":[65,7,1],"children":[{"type":"Token","kind":"FN_KW","start":[0,0,0],"end":[2,0,2]},{"type":"Token","kind":"WHITESPACE","start":[2,0,2],"end":[3,0,3]},{"type":"Node","kind":"NAME","start":[3,0,3],"end":[7,0,7],"children":[{"type":"Token","kind":"IDENT","start":[3,0,3],"end":[7,0,7]}]},{"type":"Node","kind":"PARAM_LIST","start":[7,0,7],"end":[10,0,10],"children":[{"type":"Token","kind":"L_PAREN","start":[7,0,7],"end":[8,0,8]},{"type":"Token","kind":"R_PAREN","start":[8,0,8],"end":[9,0,9]},{"type":"Token","kind":"WHITESPACE","start":[9,0,9],"end":[10,0,10]}]},{"type":"Node","kind":"BLOCK_EXPR","start":[10,0,10],"end":[65,7,1],"children":[{"type":"Node","kind":"STMT_LIST","start":[10,0,10],"end":[65,7,1],"children":[{"type":"Token","kind":"L_CURLY","start":[10,0,10],"end":[11,0,11]},{"type":"Token","kind":"NEWLINE","start":[11,0,11],"end":[12,1,0]},{"type":"Node","kind":"EXPR_STMT","start":[12,1,0],"end":[64,7,0],"children":[{"type":"Node","kind":"MACRO_EXPR","start":[12,1,0],"end":[62,6,10],"children":[{"type":"Node","kind":"MACRO_CALL","start":[12,1,0],"end":[62,6,10],"children":[{"type":"Node","kind":"PATH","start":[12,1,0],"end":[22,1,10],"children":[{"type":"Node","kind":"PATH_SEGMENT","start":[12,1,0],"end":[22,1,10],"children":[{"type":"Node","kind":"NAME_REF","start":[12,1,0],"end":[22,1,10],"children":[{"type":"Token","kind":"WHITESPACE","start":[12,1,0],"end":[16,1,4]},{"type":"Token","kind":"IDENT","start":[16,1,4],"end":[22,1,10]}]}]}]},{"type":"Token","kind":"BANG","start":[22,1,10],"end":[23,1,11]},{"type":"Node","kind":"TOKEN_TREE","start":[23,1,11],"end":[62,6,10],"children":[{"type":"Token","kind":"L_PAREN","start":[23,1,11],"end":[24,1,12]},{"type":"Node","kind":"STRING","start":[24,1,12],"end":[57,6,5],"children":[{"type":"Node","kind":"SOURCE_FILE","start":[25,1,13],"end":[25,1,13],"istart":[0,0,0],"iend":[31,2,5],"children":[{"type":"Node","kind":"FN","start":[25,1,13],"end":[25,1,13],"istart":[0,0,0],"iend":[14,1,2],"children":[{"type":"Token","kind":"NEWLINE","start":[25,1,13],"end":[25,1,13],"istart":[0,0,0],"iend":[1,0,1]},{"type":"Token","kind":"FN_KW","start":[26,2,0],"end":[26,2,0],"istart":[1,0,1],"iend":[3,0,3]},{"type":"Token","kind":"WHITESPACE","start":[28,2,2],"end":[28,2,2],"istart":[3,0,3],"iend":[4,0,4]},{"type":"Node","kind":"NAME","start":[29,2,3],"end":[29,2,3],"istart":[4,0,4],"iend":[7,0,7],"children":[{"type":"Token","kind":"IDENT","start":[29,2,3],"end":[29,2,3],"istart":[4,0,4],"iend":[7,0,7]}]},{"type":"Node","kind":"PARAM_LIST","start":[32,2,6],"end":[32,2,6],"istart":[7,0,7],"iend":[10,0,10],"children":[{"type":"Token","kind":"L_PAREN","start":[32,2,6],"end":[32,2,6],"istart":[7,0,7],"iend":[8,0,8]},{"type":"Token","kind":"R_PAREN","start":[33,2,7],"end":[33,2,7],"istart":[8,0,8],"iend":[9,0,9]},{"type":"Token","kind":"WHITESPACE","start":[34,2,8],"end":[34,2,8],"istart":[9,0,9],"iend":[10,0,10]}]},{"type":"Node","kind":"BLOCK_EXPR","start":[35,2,9],"end":[35,2,9],"istart":[10,0,10],"iend":[14,1,2],"children":[{"type":"Node","kind":"STMT_LIST","start":[35,2,9],"end":[35,2,9],"istart":[10,0,10],"iend":[14,1,2],"children":[{"type":"Token","kind":"L_CURLY","start":[35,2,9],"end":[35,2,9],"istart":[10,0,10],"iend":[11,0,11]},{"type":"Token","kind":"NEWLINE","start":[36,2,10],"end":[36,2,10],"istart":[11,0,11],"iend":[12,1,0]},{"type":"Token","kind":"R_CURLY","start":[37,3,0],"end":[37,3,0],"istart":[12,1,0],"iend":[13,1,1]},{"type":"Token","kind":"NEWLINE","start":[38,3,1],"end":[38,3,1],"istart":[13,1,1],"iend":[14,1,2]}]}]}]},{"type":"Node","kind":"FN","start":[39,4,0],"end":[39,4,0],"istart":[14,1,2],"iend":[27,2,1],"children":[{"type":"Token","kind":"FN_KW","start":[39,4,0],"end":[39,4,0],"istart":[14,1,2],"iend":[16,1,4]},{"type":"Token","kind":"WHITESPACE","start":[41,4,2],"end":[41,4,2],"istart":[16,1,4],"iend":[17,1,5]},{"type":"Node","kind":"NAME","start":[42,4,3],"end":[42,4,3],"istart":[17,1,5],"iend":[20,1,8],"children":[{"type":"Token","kind":"IDENT","start":[42,4,3],"end":[42,4,3],"istart":[17,1,5],"iend":[20,1,8]}]},{"type":"Node","kind":"PARAM_LIST","start":[45,4,6],"end":[45,4,6],"istart":[20,1,8],"iend":[23,1,11],"children":[{"type":"Token","kind":"L_PAREN","start":[45,4,6],"end":[45,4,6],"istart":[20,1,8],"iend":[21,1,9]},{"type":"Token","kind":"R_PAREN","start":[46,4,7],"end":[46,4,7],"istart":[21,1,9],"iend":[22,1,10]},{"type":"Token","kind":"WHITESPACE","start":[47,4,8],"end":[47,4,8],"istart":[22,1,10],"iend":[23,1,11]}]},{"type":"Node","kind":"BLOCK_EXPR","start":[48,4,9],"end":[48,4,9],"istart":[23,1,11],"iend":[27,2,1],"children":[{"type":"Node","kind":"STMT_LIST","start":[48,4,9],"end":[48,4,9],"istart":[23,1,11],"iend":[27,2,1],"children":[{"type":"Token","kind":"L_CURLY","start":[48,4,9],"end":[48,4,9],"istart":[23,1,11],"iend":[24,1,12]},{"type":"Token","kind":"NEWLINE","start":[49,4,10],"end":[49,4,10],"istart":[24,1,12],"iend":[25,1,13]},{"type":"Token","kind":"R_CURLY","start":[50,5,0],"end":[50,5,0],"istart":[25,1,13],"iend":[26,2,0]},{"type":"Token","kind":"NEWLINE","start":[51,5,1],"end":[51,5,1],"istart":[26,2,0],"iend":[27,2,1]}]}]}]},{"type":"Token","kind":"WHITESPACE","start":[52,6,0],"end":[52,6,0],"istart":[27,2,1],"iend":[31,2,5]},{"type":"Token","kind":"EOF","start":[56,6,4],"end":[56,6,4],"istart":[31,2,5],"iend":[31,2,5]}]}]},{"type":"Token","kind":"COMMA","start":[57,6,5],"end":[58,6,6]},{"type":"Token","kind":"WHITESPACE","start":[58,6,6],"end":[59,6,7]},{"type":"Token","kind":"STRING","start":[59,6,7],"end":[61,6,9]},{"type":"Token","kind":"R_PAREN","start":[61,6,9],"end":[62,6,10]}]}]}]},{"type":"Token","kind":"SEMICOLON","start":[62,6,10],"end":[63,6,11]},{"type":"Token","kind":"NEWLINE","start":[63,6,11],"end":[64,7,0]}]},{"type":"Token","kind":"R_CURLY","start":[64,7,0],"end":[65,7,1]}]}]}]},{"type":"Token","kind":"EOF","start":[65,7,1],"end":[65,7,1]}]}"# ]], ); @@ -234,7 +244,7 @@ fn bar() { "#, ""); }"###, expect![[ - r#"{"type":"Node","kind":"SOURCE_FILE","start":[0,0,0],"end":[68,7,1],"children":[{"type":"Node","kind":"FN","start":[0,0,0],"end":[68,7,1],"children":[{"type":"Token","kind":"FN_KW","start":[0,0,0],"end":[2,0,2]},{"type":"Token","kind":"WHITESPACE","start":[2,0,2],"end":[3,0,3]},{"type":"Node","kind":"NAME","start":[3,0,3],"end":[7,0,7],"children":[{"type":"Token","kind":"IDENT","start":[3,0,3],"end":[7,0,7]}]},{"type":"Node","kind":"PARAM_LIST","start":[7,0,7],"end":[9,0,9],"children":[{"type":"Token","kind":"L_PAREN","start":[7,0,7],"end":[8,0,8]},{"type":"Token","kind":"R_PAREN","start":[8,0,8],"end":[9,0,9]}]},{"type":"Token","kind":"WHITESPACE","start":[9,0,9],"end":[10,0,10]},{"type":"Node","kind":"BLOCK_EXPR","start":[10,0,10],"end":[68,7,1],"children":[{"type":"Node","kind":"STMT_LIST","start":[10,0,10],"end":[68,7,1],"children":[{"type":"Token","kind":"L_CURLY","start":[10,0,10],"end":[11,0,11]},{"type":"Token","kind":"WHITESPACE","start":[11,0,11],"end":[16,1,4]},{"type":"Node","kind":"EXPR_STMT","start":[16,1,4],"end":[66,6,12],"children":[{"type":"Node","kind":"MACRO_EXPR","start":[16,1,4],"end":[65,6,11],"children":[{"type":"Node","kind":"MACRO_CALL","start":[16,1,4],"end":[65,6,11],"children":[{"type":"Node","kind":"PATH","start":[16,1,4],"end":[22,1,10],"children":[{"type":"Node","kind":"PATH_SEGMENT","start":[16,1,4],"end":[22,1,10],"children":[{"type":"Node","kind":"NAME_REF","start":[16,1,4],"end":[22,1,10],"children":[{"type":"Token","kind":"IDENT","start":[16,1,4],"end":[22,1,10]}]}]}]},{"type":"Token","kind":"BANG","start":[22,1,10],"end":[23,1,11]},{"type":"Node","kind":"TOKEN_TREE","start":[23,1,11],"end":[65,6,11],"children":[{"type":"Token","kind":"L_PAREN","start":[23,1,11],"end":[24,1,12]},{"type":"Node","kind":"STRING","start":[24,1,12],"end":[60,6,6],"children":[{"type":"Node","kind":"SOURCE_FILE","start":[27,1,15],"end":[27,1,15],"istart":[0,0,0],"iend":[31,2,3],"children":[{"type":"Token","kind":"WHITESPACE","start":[27,1,15],"end":[27,1,15],"istart":[0,0,0],"iend":[1,0,1]},{"type":"Node","kind":"FN","start":[28,2,0],"end":[28,2,0],"istart":[1,0,1],"iend":[13,1,1],"children":[{"type":"Token","kind":"FN_KW","start":[28,2,0],"end":[28,2,0],"istart":[1,0,1],"iend":[3,0,3]},{"type":"Token","kind":"WHITESPACE","start":[30,2,2],"end":[30,2,2],"istart":[3,0,3],"iend":[4,0,4]},{"type":"Node","kind":"NAME","start":[31,2,3],"end":[31,2,3],"istart":[4,0,4],"iend":[7,0,7],"children":[{"type":"Token","kind":"IDENT","start":[31,2,3],"end":[31,2,3],"istart":[4,0,4],"iend":[7,0,7]}]},{"type":"Node","kind":"PARAM_LIST","start":[34,2,6],"end":[34,2,6],"istart":[7,0,7],"iend":[9,0,9],"children":[{"type":"Token","kind":"L_PAREN","start":[34,2,6],"end":[34,2,6],"istart":[7,0,7],"iend":[8,0,8]},{"type":"Token","kind":"R_PAREN","start":[35,2,7],"end":[35,2,7],"istart":[8,0,8],"iend":[9,0,9]}]},{"type":"Token","kind":"WHITESPACE","start":[36,2,8],"end":[36,2,8],"istart":[9,0,9],"iend":[10,0,10]},{"type":"Node","kind":"BLOCK_EXPR","start":[37,2,9],"end":[37,2,9],"istart":[10,0,10],"iend":[13,1,1],"children":[{"type":"Node","kind":"STMT_LIST","start":[37,2,9],"end":[37,2,9],"istart":[10,0,10],"iend":[13,1,1],"children":[{"type":"Token","kind":"L_CURLY","start":[37,2,9],"end":[37,2,9],"istart":[10,0,10],"iend":[11,0,11]},{"type":"Token","kind":"WHITESPACE","start":[38,2,10],"end":[38,2,10],"istart":[11,0,11],"iend":[12,1,0]},{"type":"Token","kind":"R_CURLY","start":[39,3,0],"end":[39,3,0],"istart":[12,1,0],"iend":[13,1,1]}]}]}]},{"type":"Token","kind":"WHITESPACE","start":[40,3,1],"end":[40,3,1],"istart":[13,1,1],"iend":[14,1,2]},{"type":"Node","kind":"FN","start":[41,4,0],"end":[41,4,0],"istart":[14,1,2],"iend":[26,1,14],"children":[{"type":"Token","kind":"FN_KW","start":[41,4,0],"end":[41,4,0],"istart":[14,1,2],"iend":[16,1,4]},{"type":"Token","kind":"WHITESPACE","start":[43,4,2],"end":[43,4,2],"istart":[16,1,4],"iend":[17,1,5]},{"type":"Node","kind":"NAME","start":[44,4,3],"end":[44,4,3],"istart":[17,1,5],"iend":[20,1,8],"children":[{"type":"Token","kind":"IDENT","start":[44,4,3],"end":[44,4,3],"istart":[17,1,5],"iend":[20,1,8]}]},{"type":"Node","kind":"PARAM_LIST","start":[47,4,6],"end":[47,4,6],"istart":[20,1,8],"iend":[22,1,10],"children":[{"type":"Token","kind":"L_PAREN","start":[47,4,6],"end":[47,4,6],"istart":[20,1,8],"iend":[21,1,9]},{"type":"Token","kind":"R_PAREN","start":[48,4,7],"end":[48,4,7],"istart":[21,1,9],"iend":[22,1,10]}]},{"type":"Token","kind":"WHITESPACE","start":[49,4,8],"end":[49,4,8],"istart":[22,1,10],"iend":[23,1,11]},{"type":"Node","kind":"BLOCK_EXPR","start":[50,4,9],"end":[50,4,9],"istart":[23,1,11],"iend":[26,1,14],"children":[{"type":"Node","kind":"STMT_LIST","start":[50,4,9],"end":[50,4,9],"istart":[23,1,11],"iend":[26,1,14],"children":[{"type":"Token","kind":"L_CURLY","start":[50,4,9],"end":[50,4,9],"istart":[23,1,11],"iend":[24,1,12]},{"type":"Token","kind":"WHITESPACE","start":[51,4,10],"end":[51,4,10],"istart":[24,1,12],"iend":[25,1,13]},{"type":"Token","kind":"R_CURLY","start":[52,5,0],"end":[52,5,0],"istart":[25,1,13],"iend":[26,1,14]}]}]}]},{"type":"Token","kind":"WHITESPACE","start":[53,5,1],"end":[53,5,1],"istart":[26,1,14],"iend":[31,2,3]}]}]},{"type":"Token","kind":"COMMA","start":[60,6,6],"end":[61,6,7]},{"type":"Token","kind":"WHITESPACE","start":[61,6,7],"end":[62,6,8]},{"type":"Token","kind":"STRING","start":[62,6,8],"end":[64,6,10]},{"type":"Token","kind":"R_PAREN","start":[64,6,10],"end":[65,6,11]}]}]}]},{"type":"Token","kind":"SEMICOLON","start":[65,6,11],"end":[66,6,12]}]},{"type":"Token","kind":"WHITESPACE","start":[66,6,12],"end":[67,7,0]},{"type":"Token","kind":"R_CURLY","start":[67,7,0],"end":[68,7,1]}]}]}]}]}"# + r#"{"type":"Node","kind":"SOURCE_FILE","start":[0,0,0],"end":[68,7,1],"children":[{"type":"Node","kind":"FN","start":[0,0,0],"end":[68,7,1],"children":[{"type":"Token","kind":"FN_KW","start":[0,0,0],"end":[2,0,2]},{"type":"Token","kind":"WHITESPACE","start":[2,0,2],"end":[3,0,3]},{"type":"Node","kind":"NAME","start":[3,0,3],"end":[7,0,7],"children":[{"type":"Token","kind":"IDENT","start":[3,0,3],"end":[7,0,7]}]},{"type":"Node","kind":"PARAM_LIST","start":[7,0,7],"end":[10,0,10],"children":[{"type":"Token","kind":"L_PAREN","start":[7,0,7],"end":[8,0,8]},{"type":"Token","kind":"R_PAREN","start":[8,0,8],"end":[9,0,9]},{"type":"Token","kind":"WHITESPACE","start":[9,0,9],"end":[10,0,10]}]},{"type":"Node","kind":"BLOCK_EXPR","start":[10,0,10],"end":[68,7,1],"children":[{"type":"Node","kind":"STMT_LIST","start":[10,0,10],"end":[68,7,1],"children":[{"type":"Token","kind":"L_CURLY","start":[10,0,10],"end":[11,0,11]},{"type":"Token","kind":"NEWLINE","start":[11,0,11],"end":[12,1,0]},{"type":"Node","kind":"EXPR_STMT","start":[12,1,0],"end":[67,7,0],"children":[{"type":"Node","kind":"MACRO_EXPR","start":[12,1,0],"end":[65,6,11],"children":[{"type":"Node","kind":"MACRO_CALL","start":[12,1,0],"end":[65,6,11],"children":[{"type":"Node","kind":"PATH","start":[12,1,0],"end":[22,1,10],"children":[{"type":"Node","kind":"PATH_SEGMENT","start":[12,1,0],"end":[22,1,10],"children":[{"type":"Node","kind":"NAME_REF","start":[12,1,0],"end":[22,1,10],"children":[{"type":"Token","kind":"WHITESPACE","start":[12,1,0],"end":[16,1,4]},{"type":"Token","kind":"IDENT","start":[16,1,4],"end":[22,1,10]}]}]}]},{"type":"Token","kind":"BANG","start":[22,1,10],"end":[23,1,11]},{"type":"Node","kind":"TOKEN_TREE","start":[23,1,11],"end":[65,6,11],"children":[{"type":"Token","kind":"L_PAREN","start":[23,1,11],"end":[24,1,12]},{"type":"Node","kind":"STRING","start":[24,1,12],"end":[60,6,6],"children":[{"type":"Node","kind":"SOURCE_FILE","start":[27,1,15],"end":[27,1,15],"istart":[0,0,0],"iend":[31,2,3],"children":[{"type":"Node","kind":"FN","start":[27,1,15],"end":[27,1,15],"istart":[0,0,0],"iend":[14,1,2],"children":[{"type":"Token","kind":"NEWLINE","start":[27,1,15],"end":[27,1,15],"istart":[0,0,0],"iend":[1,0,1]},{"type":"Token","kind":"FN_KW","start":[28,2,0],"end":[28,2,0],"istart":[1,0,1],"iend":[3,0,3]},{"type":"Token","kind":"WHITESPACE","start":[30,2,2],"end":[30,2,2],"istart":[3,0,3],"iend":[4,0,4]},{"type":"Node","kind":"NAME","start":[31,2,3],"end":[31,2,3],"istart":[4,0,4],"iend":[7,0,7],"children":[{"type":"Token","kind":"IDENT","start":[31,2,3],"end":[31,2,3],"istart":[4,0,4],"iend":[7,0,7]}]},{"type":"Node","kind":"PARAM_LIST","start":[34,2,6],"end":[34,2,6],"istart":[7,0,7],"iend":[10,0,10],"children":[{"type":"Token","kind":"L_PAREN","start":[34,2,6],"end":[34,2,6],"istart":[7,0,7],"iend":[8,0,8]},{"type":"Token","kind":"R_PAREN","start":[35,2,7],"end":[35,2,7],"istart":[8,0,8],"iend":[9,0,9]},{"type":"Token","kind":"WHITESPACE","start":[36,2,8],"end":[36,2,8],"istart":[9,0,9],"iend":[10,0,10]}]},{"type":"Node","kind":"BLOCK_EXPR","start":[37,2,9],"end":[37,2,9],"istart":[10,0,10],"iend":[14,1,2],"children":[{"type":"Node","kind":"STMT_LIST","start":[37,2,9],"end":[37,2,9],"istart":[10,0,10],"iend":[14,1,2],"children":[{"type":"Token","kind":"L_CURLY","start":[37,2,9],"end":[37,2,9],"istart":[10,0,10],"iend":[11,0,11]},{"type":"Token","kind":"NEWLINE","start":[38,2,10],"end":[38,2,10],"istart":[11,0,11],"iend":[12,1,0]},{"type":"Token","kind":"R_CURLY","start":[39,3,0],"end":[39,3,0],"istart":[12,1,0],"iend":[13,1,1]},{"type":"Token","kind":"NEWLINE","start":[40,3,1],"end":[40,3,1],"istart":[13,1,1],"iend":[14,1,2]}]}]}]},{"type":"Node","kind":"FN","start":[41,4,0],"end":[41,4,0],"istart":[14,1,2],"iend":[27,1,15],"children":[{"type":"Token","kind":"FN_KW","start":[41,4,0],"end":[41,4,0],"istart":[14,1,2],"iend":[16,1,4]},{"type":"Token","kind":"WHITESPACE","start":[43,4,2],"end":[43,4,2],"istart":[16,1,4],"iend":[17,1,5]},{"type":"Node","kind":"NAME","start":[44,4,3],"end":[44,4,3],"istart":[17,1,5],"iend":[20,1,8],"children":[{"type":"Token","kind":"IDENT","start":[44,4,3],"end":[44,4,3],"istart":[17,1,5],"iend":[20,1,8]}]},{"type":"Node","kind":"PARAM_LIST","start":[47,4,6],"end":[47,4,6],"istart":[20,1,8],"iend":[23,1,11],"children":[{"type":"Token","kind":"L_PAREN","start":[47,4,6],"end":[47,4,6],"istart":[20,1,8],"iend":[21,1,9]},{"type":"Token","kind":"R_PAREN","start":[48,4,7],"end":[48,4,7],"istart":[21,1,9],"iend":[22,1,10]},{"type":"Token","kind":"WHITESPACE","start":[49,4,8],"end":[49,4,8],"istart":[22,1,10],"iend":[23,1,11]}]},{"type":"Node","kind":"BLOCK_EXPR","start":[50,4,9],"end":[50,4,9],"istart":[23,1,11],"iend":[27,1,15],"children":[{"type":"Node","kind":"STMT_LIST","start":[50,4,9],"end":[50,4,9],"istart":[23,1,11],"iend":[27,1,15],"children":[{"type":"Token","kind":"L_CURLY","start":[50,4,9],"end":[50,4,9],"istart":[23,1,11],"iend":[24,1,12]},{"type":"Token","kind":"NEWLINE","start":[51,4,10],"end":[51,4,10],"istart":[24,1,12],"iend":[25,1,13]},{"type":"Token","kind":"R_CURLY","start":[52,5,0],"end":[52,5,0],"istart":[25,1,13],"iend":[26,1,14]},{"type":"Token","kind":"NEWLINE","start":[53,5,1],"end":[53,5,1],"istart":[26,1,14],"iend":[27,1,15]}]}]}]},{"type":"Token","kind":"WHITESPACE","start":[54,6,0],"end":[54,6,0],"istart":[27,1,15],"iend":[31,2,3]},{"type":"Token","kind":"EOF","start":[58,6,4],"end":[58,6,4],"istart":[31,2,3],"iend":[31,2,3]}]}]},{"type":"Token","kind":"COMMA","start":[60,6,6],"end":[61,6,7]},{"type":"Token","kind":"WHITESPACE","start":[61,6,7],"end":[62,6,8]},{"type":"Token","kind":"STRING","start":[62,6,8],"end":[64,6,10]},{"type":"Token","kind":"R_PAREN","start":[64,6,10],"end":[65,6,11]}]}]}]},{"type":"Token","kind":"SEMICOLON","start":[65,6,11],"end":[66,6,12]},{"type":"Token","kind":"NEWLINE","start":[66,6,12],"end":[67,7,0]}]},{"type":"Token","kind":"R_CURLY","start":[67,7,0],"end":[68,7,1]}]}]}]},{"type":"Token","kind":"EOF","start":[68,7,1],"end":[68,7,1]}]}"# ]], ); @@ -248,7 +258,7 @@ fn bar() { }"$0#, ""); }"###, expect![[ - r#"{"type":"Node","kind":"SOURCE_FILE","start":[0,0,0],"end":[63,6,1],"children":[{"type":"Node","kind":"FN","start":[0,0,0],"end":[63,6,1],"children":[{"type":"Token","kind":"FN_KW","start":[0,0,0],"end":[2,0,2]},{"type":"Token","kind":"WHITESPACE","start":[2,0,2],"end":[3,0,3]},{"type":"Node","kind":"NAME","start":[3,0,3],"end":[7,0,7],"children":[{"type":"Token","kind":"IDENT","start":[3,0,3],"end":[7,0,7]}]},{"type":"Node","kind":"PARAM_LIST","start":[7,0,7],"end":[9,0,9],"children":[{"type":"Token","kind":"L_PAREN","start":[7,0,7],"end":[8,0,8]},{"type":"Token","kind":"R_PAREN","start":[8,0,8],"end":[9,0,9]}]},{"type":"Token","kind":"WHITESPACE","start":[9,0,9],"end":[10,0,10]},{"type":"Node","kind":"BLOCK_EXPR","start":[10,0,10],"end":[63,6,1],"children":[{"type":"Node","kind":"STMT_LIST","start":[10,0,10],"end":[63,6,1],"children":[{"type":"Token","kind":"L_CURLY","start":[10,0,10],"end":[11,0,11]},{"type":"Token","kind":"WHITESPACE","start":[11,0,11],"end":[16,1,4]},{"type":"Node","kind":"EXPR_STMT","start":[16,1,4],"end":[61,5,9],"children":[{"type":"Node","kind":"MACRO_EXPR","start":[16,1,4],"end":[60,5,8],"children":[{"type":"Node","kind":"MACRO_CALL","start":[16,1,4],"end":[60,5,8],"children":[{"type":"Node","kind":"PATH","start":[16,1,4],"end":[22,1,10],"children":[{"type":"Node","kind":"PATH_SEGMENT","start":[16,1,4],"end":[22,1,10],"children":[{"type":"Node","kind":"NAME_REF","start":[16,1,4],"end":[22,1,10],"children":[{"type":"Token","kind":"IDENT","start":[16,1,4],"end":[22,1,10]}]}]}]},{"type":"Token","kind":"BANG","start":[22,1,10],"end":[23,1,11]},{"type":"Node","kind":"TOKEN_TREE","start":[23,1,11],"end":[60,5,8],"children":[{"type":"Token","kind":"L_PAREN","start":[23,1,11],"end":[24,1,12]},{"type":"Node","kind":"STRING","start":[24,1,12],"end":[55,5,3],"children":[{"type":"Node","kind":"SOURCE_FILE","start":[27,1,15],"end":[27,1,15],"istart":[0,0,0],"iend":[26,1,14],"children":[{"type":"Token","kind":"WHITESPACE","start":[27,1,15],"end":[27,1,15],"istart":[0,0,0],"iend":[1,0,1]},{"type":"Node","kind":"FN","start":[28,2,0],"end":[28,2,0],"istart":[1,0,1],"iend":[13,1,1],"children":[{"type":"Token","kind":"FN_KW","start":[28,2,0],"end":[28,2,0],"istart":[1,0,1],"iend":[3,0,3]},{"type":"Token","kind":"WHITESPACE","start":[30,2,2],"end":[30,2,2],"istart":[3,0,3],"iend":[4,0,4]},{"type":"Node","kind":"NAME","start":[31,2,3],"end":[31,2,3],"istart":[4,0,4],"iend":[7,0,7],"children":[{"type":"Token","kind":"IDENT","start":[31,2,3],"end":[31,2,3],"istart":[4,0,4],"iend":[7,0,7]}]},{"type":"Node","kind":"PARAM_LIST","start":[34,2,6],"end":[34,2,6],"istart":[7,0,7],"iend":[9,0,9],"children":[{"type":"Token","kind":"L_PAREN","start":[34,2,6],"end":[34,2,6],"istart":[7,0,7],"iend":[8,0,8]},{"type":"Token","kind":"R_PAREN","start":[35,2,7],"end":[35,2,7],"istart":[8,0,8],"iend":[9,0,9]}]},{"type":"Token","kind":"WHITESPACE","start":[36,2,8],"end":[36,2,8],"istart":[9,0,9],"iend":[10,0,10]},{"type":"Node","kind":"BLOCK_EXPR","start":[37,2,9],"end":[37,2,9],"istart":[10,0,10],"iend":[13,1,1],"children":[{"type":"Node","kind":"STMT_LIST","start":[37,2,9],"end":[37,2,9],"istart":[10,0,10],"iend":[13,1,1],"children":[{"type":"Token","kind":"L_CURLY","start":[37,2,9],"end":[37,2,9],"istart":[10,0,10],"iend":[11,0,11]},{"type":"Token","kind":"WHITESPACE","start":[38,2,10],"end":[38,2,10],"istart":[11,0,11],"iend":[12,1,0]},{"type":"Token","kind":"R_CURLY","start":[39,3,0],"end":[39,3,0],"istart":[12,1,0],"iend":[13,1,1]}]}]}]},{"type":"Token","kind":"WHITESPACE","start":[40,3,1],"end":[40,3,1],"istart":[13,1,1],"iend":[14,1,2]},{"type":"Node","kind":"FN","start":[41,4,0],"end":[41,4,0],"istart":[14,1,2],"iend":[26,1,14],"children":[{"type":"Token","kind":"FN_KW","start":[41,4,0],"end":[41,4,0],"istart":[14,1,2],"iend":[16,1,4]},{"type":"Token","kind":"WHITESPACE","start":[43,4,2],"end":[43,4,2],"istart":[16,1,4],"iend":[17,1,5]},{"type":"Node","kind":"NAME","start":[44,4,3],"end":[44,4,3],"istart":[17,1,5],"iend":[20,1,8],"children":[{"type":"Token","kind":"IDENT","start":[44,4,3],"end":[44,4,3],"istart":[17,1,5],"iend":[20,1,8]}]},{"type":"Node","kind":"PARAM_LIST","start":[47,4,6],"end":[47,4,6],"istart":[20,1,8],"iend":[22,1,10],"children":[{"type":"Token","kind":"L_PAREN","start":[47,4,6],"end":[47,4,6],"istart":[20,1,8],"iend":[21,1,9]},{"type":"Token","kind":"R_PAREN","start":[48,4,7],"end":[48,4,7],"istart":[21,1,9],"iend":[22,1,10]}]},{"type":"Token","kind":"WHITESPACE","start":[49,4,8],"end":[49,4,8],"istart":[22,1,10],"iend":[23,1,11]},{"type":"Node","kind":"BLOCK_EXPR","start":[50,4,9],"end":[50,4,9],"istart":[23,1,11],"iend":[26,1,14],"children":[{"type":"Node","kind":"STMT_LIST","start":[50,4,9],"end":[50,4,9],"istart":[23,1,11],"iend":[26,1,14],"children":[{"type":"Token","kind":"L_CURLY","start":[50,4,9],"end":[50,4,9],"istart":[23,1,11],"iend":[24,1,12]},{"type":"Token","kind":"WHITESPACE","start":[51,4,10],"end":[51,4,10],"istart":[24,1,12],"iend":[25,1,13]},{"type":"Token","kind":"R_CURLY","start":[52,5,0],"end":[52,5,0],"istart":[25,1,13],"iend":[26,1,14]}]}]}]}]}]},{"type":"Token","kind":"COMMA","start":[55,5,3],"end":[56,5,4]},{"type":"Token","kind":"WHITESPACE","start":[56,5,4],"end":[57,5,5]},{"type":"Token","kind":"STRING","start":[57,5,5],"end":[59,5,7]},{"type":"Token","kind":"R_PAREN","start":[59,5,7],"end":[60,5,8]}]}]}]},{"type":"Token","kind":"SEMICOLON","start":[60,5,8],"end":[61,5,9]}]},{"type":"Token","kind":"WHITESPACE","start":[61,5,9],"end":[62,6,0]},{"type":"Token","kind":"R_CURLY","start":[62,6,0],"end":[63,6,1]}]}]}]}]}"# + r#"{"type":"Node","kind":"SOURCE_FILE","start":[0,0,0],"end":[63,6,1],"children":[{"type":"Node","kind":"FN","start":[0,0,0],"end":[63,6,1],"children":[{"type":"Token","kind":"FN_KW","start":[0,0,0],"end":[2,0,2]},{"type":"Token","kind":"WHITESPACE","start":[2,0,2],"end":[3,0,3]},{"type":"Node","kind":"NAME","start":[3,0,3],"end":[7,0,7],"children":[{"type":"Token","kind":"IDENT","start":[3,0,3],"end":[7,0,7]}]},{"type":"Node","kind":"PARAM_LIST","start":[7,0,7],"end":[10,0,10],"children":[{"type":"Token","kind":"L_PAREN","start":[7,0,7],"end":[8,0,8]},{"type":"Token","kind":"R_PAREN","start":[8,0,8],"end":[9,0,9]},{"type":"Token","kind":"WHITESPACE","start":[9,0,9],"end":[10,0,10]}]},{"type":"Node","kind":"BLOCK_EXPR","start":[10,0,10],"end":[63,6,1],"children":[{"type":"Node","kind":"STMT_LIST","start":[10,0,10],"end":[63,6,1],"children":[{"type":"Token","kind":"L_CURLY","start":[10,0,10],"end":[11,0,11]},{"type":"Token","kind":"NEWLINE","start":[11,0,11],"end":[12,1,0]},{"type":"Node","kind":"EXPR_STMT","start":[12,1,0],"end":[62,6,0],"children":[{"type":"Node","kind":"MACRO_EXPR","start":[12,1,0],"end":[60,5,8],"children":[{"type":"Node","kind":"MACRO_CALL","start":[12,1,0],"end":[60,5,8],"children":[{"type":"Node","kind":"PATH","start":[12,1,0],"end":[22,1,10],"children":[{"type":"Node","kind":"PATH_SEGMENT","start":[12,1,0],"end":[22,1,10],"children":[{"type":"Node","kind":"NAME_REF","start":[12,1,0],"end":[22,1,10],"children":[{"type":"Token","kind":"WHITESPACE","start":[12,1,0],"end":[16,1,4]},{"type":"Token","kind":"IDENT","start":[16,1,4],"end":[22,1,10]}]}]}]},{"type":"Token","kind":"BANG","start":[22,1,10],"end":[23,1,11]},{"type":"Node","kind":"TOKEN_TREE","start":[23,1,11],"end":[60,5,8],"children":[{"type":"Token","kind":"L_PAREN","start":[23,1,11],"end":[24,1,12]},{"type":"Node","kind":"STRING","start":[24,1,12],"end":[55,5,3],"children":[{"type":"Node","kind":"SOURCE_FILE","start":[27,1,15],"end":[27,1,15],"istart":[0,0,0],"iend":[26,1,14],"children":[{"type":"Node","kind":"FN","start":[27,1,15],"end":[27,1,15],"istart":[0,0,0],"iend":[14,1,2],"children":[{"type":"Token","kind":"NEWLINE","start":[27,1,15],"end":[27,1,15],"istart":[0,0,0],"iend":[1,0,1]},{"type":"Token","kind":"FN_KW","start":[28,2,0],"end":[28,2,0],"istart":[1,0,1],"iend":[3,0,3]},{"type":"Token","kind":"WHITESPACE","start":[30,2,2],"end":[30,2,2],"istart":[3,0,3],"iend":[4,0,4]},{"type":"Node","kind":"NAME","start":[31,2,3],"end":[31,2,3],"istart":[4,0,4],"iend":[7,0,7],"children":[{"type":"Token","kind":"IDENT","start":[31,2,3],"end":[31,2,3],"istart":[4,0,4],"iend":[7,0,7]}]},{"type":"Node","kind":"PARAM_LIST","start":[34,2,6],"end":[34,2,6],"istart":[7,0,7],"iend":[10,0,10],"children":[{"type":"Token","kind":"L_PAREN","start":[34,2,6],"end":[34,2,6],"istart":[7,0,7],"iend":[8,0,8]},{"type":"Token","kind":"R_PAREN","start":[35,2,7],"end":[35,2,7],"istart":[8,0,8],"iend":[9,0,9]},{"type":"Token","kind":"WHITESPACE","start":[36,2,8],"end":[36,2,8],"istart":[9,0,9],"iend":[10,0,10]}]},{"type":"Node","kind":"BLOCK_EXPR","start":[37,2,9],"end":[37,2,9],"istart":[10,0,10],"iend":[14,1,2],"children":[{"type":"Node","kind":"STMT_LIST","start":[37,2,9],"end":[37,2,9],"istart":[10,0,10],"iend":[14,1,2],"children":[{"type":"Token","kind":"L_CURLY","start":[37,2,9],"end":[37,2,9],"istart":[10,0,10],"iend":[11,0,11]},{"type":"Token","kind":"NEWLINE","start":[38,2,10],"end":[38,2,10],"istart":[11,0,11],"iend":[12,1,0]},{"type":"Token","kind":"R_CURLY","start":[39,3,0],"end":[39,3,0],"istart":[12,1,0],"iend":[13,1,1]},{"type":"Token","kind":"NEWLINE","start":[40,3,1],"end":[40,3,1],"istart":[13,1,1],"iend":[14,1,2]}]}]}]},{"type":"Node","kind":"FN","start":[41,4,0],"end":[41,4,0],"istart":[14,1,2],"iend":[26,1,14],"children":[{"type":"Token","kind":"FN_KW","start":[41,4,0],"end":[41,4,0],"istart":[14,1,2],"iend":[16,1,4]},{"type":"Token","kind":"WHITESPACE","start":[43,4,2],"end":[43,4,2],"istart":[16,1,4],"iend":[17,1,5]},{"type":"Node","kind":"NAME","start":[44,4,3],"end":[44,4,3],"istart":[17,1,5],"iend":[20,1,8],"children":[{"type":"Token","kind":"IDENT","start":[44,4,3],"end":[44,4,3],"istart":[17,1,5],"iend":[20,1,8]}]},{"type":"Node","kind":"PARAM_LIST","start":[47,4,6],"end":[47,4,6],"istart":[20,1,8],"iend":[23,1,11],"children":[{"type":"Token","kind":"L_PAREN","start":[47,4,6],"end":[47,4,6],"istart":[20,1,8],"iend":[21,1,9]},{"type":"Token","kind":"R_PAREN","start":[48,4,7],"end":[48,4,7],"istart":[21,1,9],"iend":[22,1,10]},{"type":"Token","kind":"WHITESPACE","start":[49,4,8],"end":[49,4,8],"istart":[22,1,10],"iend":[23,1,11]}]},{"type":"Node","kind":"BLOCK_EXPR","start":[50,4,9],"end":[50,4,9],"istart":[23,1,11],"iend":[26,1,14],"children":[{"type":"Node","kind":"STMT_LIST","start":[50,4,9],"end":[50,4,9],"istart":[23,1,11],"iend":[26,1,14],"children":[{"type":"Token","kind":"L_CURLY","start":[50,4,9],"end":[50,4,9],"istart":[23,1,11],"iend":[24,1,12]},{"type":"Token","kind":"NEWLINE","start":[51,4,10],"end":[51,4,10],"istart":[24,1,12],"iend":[25,1,13]},{"type":"Token","kind":"R_CURLY","start":[52,5,0],"end":[52,5,0],"istart":[25,1,13],"iend":[26,1,14]}]}]}]},{"type":"Token","kind":"EOF","start":[53,5,1],"end":[53,5,1],"istart":[26,1,14],"iend":[26,1,14]}]}]},{"type":"Token","kind":"COMMA","start":[55,5,3],"end":[56,5,4]},{"type":"Token","kind":"WHITESPACE","start":[56,5,4],"end":[57,5,5]},{"type":"Token","kind":"STRING","start":[57,5,5],"end":[59,5,7]},{"type":"Token","kind":"R_PAREN","start":[59,5,7],"end":[60,5,8]}]}]}]},{"type":"Token","kind":"SEMICOLON","start":[60,5,8],"end":[61,5,9]},{"type":"Token","kind":"NEWLINE","start":[61,5,9],"end":[62,6,0]}]},{"type":"Token","kind":"R_CURLY","start":[62,6,0],"end":[63,6,1]}]}]}]},{"type":"Token","kind":"EOF","start":[63,6,1],"end":[63,6,1]}]}"# ]], ); } diff --git a/crates/load-cargo/src/lib.rs b/crates/load-cargo/src/lib.rs index bf2331a40f9b..44c6b8fe43ba 100644 --- a/crates/load-cargo/src/lib.rs +++ b/crates/load-cargo/src/lib.rs @@ -718,10 +718,12 @@ impl ProcMacroExpander for Expander { let call_site_ast_id = macro_call_loc.kind.erased_ast_id(); if let Some(editioned_file_id) = call_site_file.file_id() { - let range = hir_expand::HirFileId::from(editioned_file_id) + let file_id = hir_expand::HirFileId::from(editioned_file_id); + let range = file_id .ast_id_map(db) .get_erased(call_site_ast_id) - .text_range(); + .to_node(&file_id.parse_or_expand(db)) + .text_range_without_outer_trivia(); let parent_span = Some(ParentSpan { file_id: editioned_file_id.span_file_id(db).as_u32(), diff --git a/crates/parser/src/lexed_str.rs b/crates/parser/src/lexed_str.rs index ec994b731bf9..47fae0aa73c3 100644 --- a/crates/parser/src/lexed_str.rs +++ b/crates/parser/src/lexed_str.rs @@ -210,6 +210,23 @@ impl<'a> Converter<'a> { // being `u16` that come from `rowan::SyntaxKind`. let mut errors: Vec = vec![]; + if let rustc_lexer::TokenKind::Whitespace = kind { + let mut rest = token_text; + while let Some(idx) = rest.find('\n') { + let (line, tail) = rest.split_at(idx + 1); + let newline = if line.ends_with("\r\n") { 2 } else { 1 }; + if line.len() > newline { + self.push(WHITESPACE, line.len() - newline, Vec::new()); + } + self.push(NEWLINE, newline, Vec::new()); + rest = tail; + } + if !rest.is_empty() { + self.push(WHITESPACE, rest.len(), Vec::new()); + } + return; + } + let syntax_kind = { match kind { rustc_lexer::TokenKind::LineComment { doc_style } => Self::comment_kind(*doc_style), diff --git a/crates/parser/src/lib.rs b/crates/parser/src/lib.rs index 5900d7cfeda9..ae81c13f1e99 100644 --- a/crates/parser/src/lib.rs +++ b/crates/parser/src/lib.rs @@ -52,7 +52,7 @@ pub use crate::{ input::Input, lexed_str::LexedStr, output::{Output, Step}, - shortcuts::StrStep, + shortcuts::{StrStep, Trivia}, syntax_kind::SyntaxKind, }; diff --git a/crates/parser/src/shortcuts.rs b/crates/parser/src/shortcuts.rs index 3c19e025453a..187dbe41122f 100644 --- a/crates/parser/src/shortcuts.rs +++ b/crates/parser/src/shortcuts.rs @@ -9,16 +9,25 @@ //! that needs to live somewhere. Rather than putting it to lexer or parser, we //! use a separate shortcuts module for that. -use std::mem; +use std::{fmt, mem}; -use crate::{ - Edition, LexedStr, Step, - SyntaxKind::{self, *}, -}; +use crate::{Edition, LexedStr, Step, SyntaxKind}; + +#[derive(Clone, Copy)] +pub struct Trivia<'a> { + pub kind: SyntaxKind, + pub text: &'a str, +} + +impl fmt::Debug for Trivia<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{:?}({:?})", self.kind, self.text) + } +} #[derive(Debug)] pub enum StrStep<'a> { - Token { kind: SyntaxKind, text: &'a str }, + Token { kind: SyntaxKind, text: &'a str, leading: &'a [Trivia<'a>], trailing: &'a [Trivia<'a>] }, Enter { kind: SyntaxKind }, Exit, Error { msg: &'a str, pos: usize }, @@ -68,7 +77,16 @@ impl LexedStr<'_> { output: &crate::Output, sink: &mut dyn FnMut(StrStep<'_>), ) -> bool { - let mut builder = Builder { lexed: self, pos: 0, state: State::PendingEnter, sink }; + let mut builder = Builder { + lexed: self, + pos: 0, + last_end: 0, + after_enter: false, + leading: Vec::new(), + trailing: Vec::new(), + state: State::PendingEnter, + sink, + }; for event in output.iter() { match event { @@ -81,15 +99,18 @@ impl LexedStr<'_> { Step::Enter { kind } => builder.enter(kind), Step::Exit => builder.exit(), Step::Error { msg } => { - let text_pos = builder.lexed.text_start(builder.pos); - (builder.sink)(StrStep::Error { msg, pos: text_pos }); + let pos = match builder.after_enter { + true => builder.next_token_start(), + false => builder.last_end, + }; + (builder.sink)(StrStep::Error { msg, pos }); } } } match mem::replace(&mut builder.state, State::Normal) { State::PendingExit => { - builder.eat_trivias(); + builder.eof(); (builder.sink)(StrStep::Exit); } State::PendingEnter | State::Normal => unreachable!(), @@ -103,6 +124,10 @@ impl LexedStr<'_> { struct Builder<'a, 'b> { lexed: &'a LexedStr<'a>, pos: usize, + last_end: usize, + after_enter: bool, + leading: Vec>, + trailing: Vec>, state: State, sink: &'b mut dyn FnMut(StrStep<'_>), } @@ -113,14 +138,13 @@ enum State { PendingExit, } -impl Builder<'_, '_> { +impl<'a> Builder<'a, '_> { fn token(&mut self, kind: SyntaxKind, n_tokens: u8) { match mem::replace(&mut self.state, State::Normal) { State::PendingEnter => unreachable!(), State::PendingExit => (self.sink)(StrStep::Exit), State::Normal => (), } - self.eat_trivias(); self.do_token(kind, n_tokens as usize); } @@ -130,7 +154,6 @@ impl Builder<'_, '_> { State::PendingExit => (self.sink)(StrStep::Exit), State::Normal => (), } - self.eat_trivias(); self.do_float_split(has_pseudo_dot); } @@ -146,16 +169,13 @@ impl Builder<'_, '_> { State::Normal => (), } - let n_trivias = - (self.pos..self.lexed.len()).take_while(|&it| self.lexed.kind(it).is_trivia()).count(); - let leading_trivias = self.pos..self.pos + n_trivias; - let n_attached_trivias = n_attached_trivias( - kind, - leading_trivias.rev().map(|it| (self.lexed.kind(it), self.lexed.text(it))), - ); - self.eat_n_trivias(n_trivias - n_attached_trivias); (self.sink)(StrStep::Enter { kind }); - self.eat_n_trivias(n_attached_trivias); + self.after_enter = true; + } + + fn next_token_start(&self) -> usize { + let next = (self.pos..self.lexed.len()).find(|&it| !self.lexed.kind(it).is_trivia()); + self.lexed.text_start(next.unwrap_or(self.lexed.len())) } fn exit(&mut self) { @@ -166,52 +186,100 @@ impl Builder<'_, '_> { } } - fn eat_trivias(&mut self) { - while self.pos < self.lexed.len() { + fn take_leading(&mut self) { + self.leading.clear(); + while self.pos < self.lexed.len() && self.lexed.kind(self.pos).is_trivia() { + self.leading + .push(Trivia { kind: self.lexed.kind(self.pos), text: self.lexed.text(self.pos) }); + self.pos += 1; + } + } + + fn take_trailing(&mut self) { + self.trailing.clear(); + while self.pos < self.lexed.len() && self.lexed.kind(self.pos).is_trivia() { let kind = self.lexed.kind(self.pos); - if !kind.is_trivia() { + self.trailing.push(Trivia { kind, text: self.lexed.text(self.pos) }); + self.pos += 1; + if kind == SyntaxKind::NEWLINE { break; } - self.do_token(kind, 1); } } - fn eat_n_trivias(&mut self, n: usize) { - for _ in 0..n { - let kind = self.lexed.kind(self.pos); - assert!(kind.is_trivia()); - self.do_token(kind, 1); - } + fn eof(&mut self) { + self.take_leading(); + (self.sink)(StrStep::Token { + kind: SyntaxKind::EOF, + text: "", + leading: &self.leading, + trailing: &[], + }); } fn do_token(&mut self, kind: SyntaxKind, n_tokens: usize) { - let text = &self.lexed.range_text(self.pos..self.pos + n_tokens); + self.take_leading(); + let text = self.lexed.range_text(self.pos..self.pos + n_tokens); self.pos += n_tokens; - (self.sink)(StrStep::Token { kind, text }); + self.last_end = self.lexed.text_start(self.pos); + self.after_enter = false; + self.take_trailing(); + (self.sink)(StrStep::Token { + kind, + text, + leading: &self.leading, + trailing: &self.trailing, + }); } fn do_float_split(&mut self, has_pseudo_dot: bool) { - let text = &self.lexed.range_text(self.pos..self.pos + 1); + self.take_leading(); + let start = self.pos; + let text = self.lexed.range_text(self.pos..self.pos + 1); + self.pos += 1; + self.last_end = self.lexed.text_start(self.pos); + self.after_enter = false; + self.take_trailing(); match text.split_once('.') { Some((left, right)) => { assert!(!left.is_empty()); (self.sink)(StrStep::Enter { kind: SyntaxKind::NAME_REF }); - (self.sink)(StrStep::Token { kind: SyntaxKind::INT_NUMBER, text: left }); + (self.sink)(StrStep::Token { + kind: SyntaxKind::INT_NUMBER, + text: left, + leading: &self.leading, + trailing: &[], + }); (self.sink)(StrStep::Exit); // here we move the exit up, the original exit has been deleted in process (self.sink)(StrStep::Exit); - (self.sink)(StrStep::Token { kind: SyntaxKind::DOT, text: "." }); - if has_pseudo_dot { assert!(right.is_empty(), "{left}.{right}"); + (self.sink)(StrStep::Token { + kind: SyntaxKind::DOT, + text: ".", + leading: &[], + trailing: &self.trailing, + }); self.state = State::Normal; } else { assert!(!right.is_empty(), "{left}.{right}"); + (self.sink)(StrStep::Token { + kind: SyntaxKind::DOT, + text: ".", + leading: &[], + trailing: &[], + }); (self.sink)(StrStep::Enter { kind: SyntaxKind::NAME_REF }); - (self.sink)(StrStep::Token { kind: SyntaxKind::INT_NUMBER, text: right }); + (self.sink)(StrStep::Token { + kind: SyntaxKind::INT_NUMBER, + text: right, + leading: &[], + trailing: &self.trailing, + }); (self.sink)(StrStep::Exit); // the parser creates an unbalanced start node, we are required to close it here @@ -219,11 +287,17 @@ impl Builder<'_, '_> { } } None => { - // illegal float literal which doesn't have dot in form (like 1e0) - // we should emit an error node here - (self.sink)(StrStep::Error { msg: "illegal float literal", pos: self.pos }); + (self.sink)(StrStep::Error { + msg: "illegal float literal", + pos: self.lexed.text_start(start), + }); (self.sink)(StrStep::Enter { kind: SyntaxKind::ERROR }); - (self.sink)(StrStep::Token { kind: SyntaxKind::FLOAT_NUMBER, text }); + (self.sink)(StrStep::Token { + kind: SyntaxKind::FLOAT_NUMBER, + text, + leading: &self.leading, + trailing: &self.trailing, + }); (self.sink)(StrStep::Exit); // move up @@ -232,56 +306,5 @@ impl Builder<'_, '_> { self.state = if has_pseudo_dot { State::Normal } else { State::PendingExit }; } } - - self.pos += 1; - } -} - -fn n_attached_trivias<'a>( - kind: SyntaxKind, - trivias: impl Iterator, -) -> usize { - match kind { - CONST | ENUM | FN | IMPL | MACRO_CALL | MACRO_DEF | MACRO_RULES | MODULE | RECORD_FIELD - | STATIC | STRUCT | TRAIT | TUPLE_FIELD | TYPE_ALIAS | UNION | USE | VARIANT - | EXTERN_CRATE => { - let mut res = 0; - let mut trivias = trivias.enumerate().peekable(); - - while let Some((i, (kind, text))) = trivias.next() { - match kind { - WHITESPACE if text.contains("\n\n") => { - // we check whether the next token is a doc-comment - // and skip the whitespace in this case - if let Some((COMMENT, peek_text)) = trivias.peek().map(|(_, pair)| pair) - && is_outer(peek_text) - { - continue; - } - break; - } - COMMENT => { - if is_inner(text) { - break; - } - res = i + 1; - } - _ => (), - } - } - res - } - _ => 0, - } -} - -fn is_outer(text: &str) -> bool { - if text.starts_with("////") || text.starts_with("/***") { - return false; } - text.starts_with("///") || text.starts_with("/**") -} - -fn is_inner(text: &str) -> bool { - text.starts_with("//!") || text.starts_with("/*!") } diff --git a/crates/parser/src/syntax_kind.rs b/crates/parser/src/syntax_kind.rs index 7311947525ed..30351d1ec400 100644 --- a/crates/parser/src/syntax_kind.rs +++ b/crates/parser/src/syntax_kind.rs @@ -27,7 +27,7 @@ impl From for u16 { impl SyntaxKind { #[inline] pub fn is_trivia(self) -> bool { - matches!(self, SyntaxKind::WHITESPACE | SyntaxKind::COMMENT) + matches!(self, SyntaxKind::WHITESPACE | SyntaxKind::NEWLINE | SyntaxKind::COMMENT) } /// Returns true if this is an identifier or a keyword. diff --git a/crates/parser/src/tests.rs b/crates/parser/src/tests.rs index cec50aa54b7f..7e5463e96818 100644 --- a/crates/parser/src/tests.rs +++ b/crates/parser/src/tests.rs @@ -88,10 +88,15 @@ fn parse(entry: TopEntryPoint, text: &str, edition: Edition) -> (String, bool) { let mut depth = 0; let mut len = 0; lexed.intersperse_trivia(&output, &mut |step| match step { - crate::StrStep::Token { kind, text } => { + crate::StrStep::Token { kind, text, leading, trailing } => { assert!(depth > 0); + if leading.is_empty() && trailing.is_empty() { + writeln!(buf, "{indent}{kind:?} {text:?}").unwrap(); + } else { + writeln!(buf, "{indent}{kind:?} {text:?} {leading:?} {trailing:?}").unwrap(); + } + len += leading.iter().chain(trailing).map(|it| it.text.len()).sum::(); len += text.len(); - writeln!(buf, "{indent}{kind:?} {text:?}").unwrap(); } crate::StrStep::Enter { kind } => { assert!(depth > 0 || len == 0); diff --git a/crates/parser/src/tests/top_entries.rs b/crates/parser/src/tests/top_entries.rs index 6cad71093fd7..28e2fdba3b02 100644 --- a/crates/parser/src/tests/top_entries.rs +++ b/crates/parser/src/tests/top_entries.rs @@ -8,22 +8,23 @@ fn source_file() { TopEntryPoint::SourceFile, "", expect![[r#" - SOURCE_FILE - "#]], + SOURCE_FILE + EOF "" + "#]], ); check( TopEntryPoint::SourceFile, "struct S;", expect![[r#" - SOURCE_FILE - STRUCT - STRUCT_KW "struct" - WHITESPACE " " - NAME - IDENT "S" - SEMICOLON ";" - "#]], + SOURCE_FILE + STRUCT + STRUCT_KW "struct" [] [WHITESPACE(" ")] + NAME + IDENT "S" + SEMICOLON ";" + EOF "" + "#]], ); check( @@ -40,6 +41,7 @@ fn source_file() { IDENT "error" ERROR AT "@" + EOF "" error 0: expected an item error 6: expected an item error 6: expected an item @@ -54,6 +56,7 @@ fn macro_stmt() { "", expect![[r#" MACRO_STMTS + EOF "" "#]], ); check( @@ -63,6 +66,7 @@ fn macro_stmt() { MACRO_STMTS ERROR SHEBANG "#!/usr/bin/rust" + EOF "" error 0: expected expression, item or let statement "##]], ); @@ -72,27 +76,22 @@ fn macro_stmt() { expect![[r#" MACRO_STMTS LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "x" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "1" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] EXPR_STMT LITERAL - INT_NUMBER "2" - WHITESPACE " " + INT_NUMBER "2" [] [WHITESPACE(" ")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" SEMICOLON ";" + EOF "" "#]], ); } @@ -104,6 +103,7 @@ fn macro_items() { "", expect![[r#" MACRO_ITEMS + EOF "" "#]], ); check( @@ -113,6 +113,7 @@ fn macro_items() { MACRO_ITEMS ERROR SHEBANG "#!/usr/bin/rust" + EOF "" error 0: expected an item "##]], ); @@ -122,12 +123,10 @@ fn macro_items() { expect![[r#" MACRO_ITEMS STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] MACRO_CALL PATH PATH_SEGMENT @@ -137,6 +136,7 @@ fn macro_items() { TOKEN_TREE L_CURLY "{" R_CURLY "}" + EOF "" "#]], ); } @@ -148,6 +148,7 @@ fn macro_pattern() { "", expect![[r#" ERROR + EOF "" error 0: expected pattern "#]], ); @@ -164,6 +165,7 @@ fn macro_pattern() { WILDCARD_PAT UNDERSCORE "_" R_PAREN ")" + EOF "" "#]], ); @@ -174,11 +176,10 @@ fn macro_pattern() { ERROR IDENT_PAT NAME - IDENT "None" - WHITESPACE " " - IDENT "leftover" - WHITESPACE " " + IDENT "None" [] [WHITESPACE(" ")] + IDENT "leftover" [] [WHITESPACE(" ")] IDENT "tokens" + EOF "" "#]], ); @@ -190,6 +191,7 @@ fn macro_pattern() { ERROR AT "@" IDENT "err" + EOF "" error 0: expected pattern "#]], ); @@ -199,17 +201,15 @@ fn macro_pattern() { "| 42 | 43", expect![[r#" OR_PAT - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] LITERAL_PAT LITERAL - INT_NUMBER "42" - WHITESPACE " " - PIPE "|" - WHITESPACE " " + INT_NUMBER "42" [] [WHITESPACE(" ")] + PIPE "|" [] [WHITESPACE(" ")] LITERAL_PAT LITERAL INT_NUMBER "43" + EOF "" "#]], ); @@ -218,11 +218,11 @@ fn macro_pattern() { "| 42", expect![[r#" OR_PAT - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] LITERAL_PAT LITERAL INT_NUMBER "42" + EOF "" "#]], ); } @@ -234,6 +234,7 @@ fn type_() { "", expect![[r#" ERROR + EOF "" error 0: expected type "#]], ); @@ -253,6 +254,7 @@ fn type_() { NEVER_TYPE BANG "!" R_ANGLE ">" + EOF "" "#]], ); check( @@ -262,13 +264,12 @@ fn type_() { ERROR TUPLE_TYPE L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] L_PAREN "(" R_PAREN ")" + EOF "" "#]], ); check( @@ -280,6 +281,7 @@ fn type_() { DOLLAR "$" DOLLAR "$" DOLLAR "$" + EOF "" error 0: expected type "#]], ); @@ -292,6 +294,7 @@ fn expr() { "", expect![[r#" ERROR + EOF "" error 0: expected expression "#]], ); @@ -299,21 +302,18 @@ fn expr() { TopEntryPoint::Expr, "2 + 2 == 5", expect![[r#" - BIN_EXPR - BIN_EXPR - LITERAL - INT_NUMBER "2" - WHITESPACE " " - PLUS "+" - WHITESPACE " " - LITERAL - INT_NUMBER "2" - WHITESPACE " " - EQ2 "==" - WHITESPACE " " - LITERAL - INT_NUMBER "5" - "#]], + BIN_EXPR + BIN_EXPR + LITERAL + INT_NUMBER "2" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] + LITERAL + INT_NUMBER "2" [] [WHITESPACE(" ")] + EQ2 "==" [] [WHITESPACE(" ")] + LITERAL + INT_NUMBER "5" + EOF "" + "#]], ); check( TopEntryPoint::Expr, @@ -321,16 +321,14 @@ fn expr() { expect![[r#" ERROR LET_EXPR - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" SEMICOLON ";" + EOF "" "#]], ); } diff --git a/crates/parser/test_data/lexer/err/byte_char_literals.rast b/crates/parser/test_data/lexer/err/byte_char_literals.rast index 7603c9099daa..f6f7d87a736a 100644 --- a/crates/parser/test_data/lexer/err/byte_char_literals.rast +++ b/crates/parser/test_data/lexer/err/byte_char_literals.rast @@ -1,86 +1,86 @@ BYTE "b''" error: empty character literal -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\'" error: Missing trailing `'` symbol to terminate the byte literal -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\n'" error: byte constant must be escaped -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'spam'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\x0ff'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\\"a'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\na'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\ra'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\ta'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\\\a'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\'a'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\0a'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u{0}x'" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u{1F63b}}'" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\v'" error: unknown byte escape -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\💩'" error: unknown byte escape -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\●'" error: unknown byte escape -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\\\\\r'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\x'" error: numeric character escape is too short -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\x0'" error: numeric character escape is too short -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\xf'" error: numeric character escape is too short -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\xa'" error: numeric character escape is too short -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\xx'" error: invalid character in numeric character escape -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\xы'" error: invalid character in numeric character escape -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\x🦀'" error: invalid character in numeric character escape -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\xtt'" error: invalid character in numeric character escape -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u'" error: incorrect unicode escape sequence -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u[0123]'" error: incorrect unicode escape sequence -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u{0x}'" error: invalid character in unicode escape -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u{'" error: unterminated unicode escape -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u{0000'" error: unterminated unicode escape -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u{}'" error: empty unicode escape -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u{_0000}'" error: invalid start of unicode escape -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u{0000000}'" error: overlong unicode escape -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u{FFFFFF}'" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u{ffffff}'" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u{ffffff}'" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u{DC00}'" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u{DDDD}'" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u{DFFF}'" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u{D800}'" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u{DAAA}'" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\u{DBFF}'" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/err/byte_strings.rast b/crates/parser/test_data/lexer/err/byte_strings.rast index e8d8ff8cefb4..4312c41e3251 100644 --- a/crates/parser/test_data/lexer/err/byte_strings.rast +++ b/crates/parser/test_data/lexer/err/byte_strings.rast @@ -1,28 +1,28 @@ BYTE_STRING "b\"\\💩\"" error: unknown byte escape -WHITESPACE "\n" +NEWLINE "\n" BYTE_STRING "b\"\\●\"" error: unknown byte escape -WHITESPACE "\n" +NEWLINE "\n" BYTE_STRING "b\"\\u{_0000}\"" error: invalid start of unicode escape -WHITESPACE "\n" +NEWLINE "\n" BYTE_STRING "b\"\\u{0000000}\"" error: overlong unicode escape -WHITESPACE "\n" +NEWLINE "\n" BYTE_STRING "b\"\\u{FFFFFF}\"" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE_STRING "b\"\\u{ffffff}\"" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE_STRING "b\"\\u{ffffff}\"" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE_STRING "b\"\\u{DC00}\"" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE_STRING "b\"\\u{DDDD}\"" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE_STRING "b\"\\u{DFFF}\"" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE_STRING "b\"\\u{D800}\"" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE_STRING "b\"\\u{DAAA}\"" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE_STRING "b\"\\u{DBFF}\"" error: unicode escape in byte string -WHITESPACE "\n" +NEWLINE "\n" BYTE_STRING "b\"\\xы\"" error: invalid character in numeric character escape -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/err/c_strings.rast b/crates/parser/test_data/lexer/err/c_strings.rast index 1b4424ba5c78..e7b49fafe5e8 100644 --- a/crates/parser/test_data/lexer/err/c_strings.rast +++ b/crates/parser/test_data/lexer/err/c_strings.rast @@ -1,28 +1,28 @@ C_STRING "c\"\\💩\"" error: unknown character escape -WHITESPACE "\n" +NEWLINE "\n" C_STRING "c\"\\●\"" error: unknown character escape -WHITESPACE "\n" +NEWLINE "\n" C_STRING "c\"\\u{_0000}\"" error: invalid start of unicode escape -WHITESPACE "\n" +NEWLINE "\n" C_STRING "c\"\\u{0000000}\"" error: overlong unicode escape -WHITESPACE "\n" +NEWLINE "\n" C_STRING "c\"\\u{FFFFFF}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" C_STRING "c\"\\u{ffffff}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" C_STRING "c\"\\u{ffffff}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" C_STRING "c\"\\u{DC00}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" C_STRING "c\"\\u{DDDD}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" C_STRING "c\"\\u{DFFF}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" C_STRING "c\"\\u{D800}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" C_STRING "c\"\\u{DAAA}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" C_STRING "c\"\\u{DBFF}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" C_STRING "c\"\\xы\"" error: invalid character in numeric character escape -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/err/char_literals.rast b/crates/parser/test_data/lexer/err/char_literals.rast index b1e1364d4c2c..c75aa6978d70 100644 --- a/crates/parser/test_data/lexer/err/char_literals.rast +++ b/crates/parser/test_data/lexer/err/char_literals.rast @@ -1,92 +1,92 @@ CHAR "'hello'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" CHAR "''" error: empty character literal -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\n'" error: character constant must be escaped -WHITESPACE "\n" +NEWLINE "\n" CHAR "'spam'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\x0ff'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\\"a'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\na'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\ra'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\ta'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\\\a'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\'a'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\0a'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u{0}x'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u{1F63b}}'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\v'" error: unknown character escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\💩'" error: unknown character escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\●'" error: unknown character escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\\\\\r'" error: character literal may only contain one codepoint -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\x'" error: numeric character escape is too short -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\x0'" error: numeric character escape is too short -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\xf'" error: numeric character escape is too short -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\xa'" error: numeric character escape is too short -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\xx'" error: invalid character in numeric character escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\xы'" error: invalid character in numeric character escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\x🦀'" error: invalid character in numeric character escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\xtt'" error: invalid character in numeric character escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\xff'" error: out of range hex escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\xFF'" error: out of range hex escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\x80'" error: out of range hex escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u'" error: incorrect unicode escape sequence -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u[0123]'" error: incorrect unicode escape sequence -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u{0x}'" error: invalid character in unicode escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u{'" error: unterminated unicode escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u{0000'" error: unterminated unicode escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u{}'" error: empty unicode escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u{_0000}'" error: invalid start of unicode escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u{0000000}'" error: overlong unicode escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u{FFFFFF}'" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u{ffffff}'" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u{ffffff}'" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u{DC00}'" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u{DDDD}'" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u{DFFF}'" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u{D800}'" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u{DAAA}'" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" CHAR "'\\u{DBFF}'" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/err/empty_exponent.rast b/crates/parser/test_data/lexer/err/empty_exponent.rast index af03d73ced9a..de05a78c70b8 100644 --- a/crates/parser/test_data/lexer/err/empty_exponent.rast +++ b/crates/parser/test_data/lexer/err/empty_exponent.rast @@ -1,48 +1,52 @@ FLOAT_NUMBER "0e" error: Missing digits after the exponent symbol -WHITESPACE "\n" +NEWLINE "\n" FLOAT_NUMBER "0E" error: Missing digits after the exponent symbol -WHITESPACE "\n\n" +NEWLINE "\n" +NEWLINE "\n" FLOAT_NUMBER "42e+" error: Missing digits after the exponent symbol -WHITESPACE "\n" +NEWLINE "\n" FLOAT_NUMBER "42e-" error: Missing digits after the exponent symbol -WHITESPACE "\n" +NEWLINE "\n" FLOAT_NUMBER "42E+" error: Missing digits after the exponent symbol -WHITESPACE "\n" +NEWLINE "\n" FLOAT_NUMBER "42E-" error: Missing digits after the exponent symbol -WHITESPACE "\n\n" +NEWLINE "\n" +NEWLINE "\n" INT_NUMBER "42" DOT "." IDENT "e" PLUS "+" -WHITESPACE "\n" +NEWLINE "\n" INT_NUMBER "42" DOT "." IDENT "e" MINUS "-" -WHITESPACE "\n" +NEWLINE "\n" INT_NUMBER "42" DOT "." IDENT "E" PLUS "+" -WHITESPACE "\n" +NEWLINE "\n" INT_NUMBER "42" DOT "." IDENT "E" MINUS "-" -WHITESPACE "\n\n" +NEWLINE "\n" +NEWLINE "\n" FLOAT_NUMBER "42.2e+" error: Missing digits after the exponent symbol -WHITESPACE "\n" +NEWLINE "\n" FLOAT_NUMBER "42.2e-" error: Missing digits after the exponent symbol -WHITESPACE "\n" +NEWLINE "\n" FLOAT_NUMBER "42.2E+" error: Missing digits after the exponent symbol -WHITESPACE "\n" +NEWLINE "\n" FLOAT_NUMBER "42.2E-" error: Missing digits after the exponent symbol -WHITESPACE "\n\n" +NEWLINE "\n" +NEWLINE "\n" FLOAT_NUMBER "42.2e+f32" error: Missing digits after the exponent symbol -WHITESPACE "\n" +NEWLINE "\n" FLOAT_NUMBER "42.2e-f32" error: Missing digits after the exponent symbol -WHITESPACE "\n" +NEWLINE "\n" FLOAT_NUMBER "42.2E+f32" error: Missing digits after the exponent symbol -WHITESPACE "\n" +NEWLINE "\n" FLOAT_NUMBER "42.2E-f32" error: Missing digits after the exponent symbol -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/err/empty_int.rast b/crates/parser/test_data/lexer/err/empty_int.rast index 7f7194f4522e..fc8e3677182d 100644 --- a/crates/parser/test_data/lexer/err/empty_int.rast +++ b/crates/parser/test_data/lexer/err/empty_int.rast @@ -1,26 +1,30 @@ INT_NUMBER "0b" error: Missing digits after the integer base prefix -WHITESPACE "\n" +NEWLINE "\n" INT_NUMBER "0o" error: Missing digits after the integer base prefix -WHITESPACE "\n" +NEWLINE "\n" INT_NUMBER "0x" error: Missing digits after the integer base prefix -WHITESPACE "\n\n" +NEWLINE "\n" +NEWLINE "\n" INT_NUMBER "0b_" error: Missing digits after the integer base prefix -WHITESPACE "\n" +NEWLINE "\n" INT_NUMBER "0o_" error: Missing digits after the integer base prefix -WHITESPACE "\n" +NEWLINE "\n" INT_NUMBER "0x_" error: Missing digits after the integer base prefix -WHITESPACE "\n\n" +NEWLINE "\n" +NEWLINE "\n" INT_NUMBER "0bnoDigit" error: Missing digits after the integer base prefix -WHITESPACE "\n" +NEWLINE "\n" INT_NUMBER "0onoDigit" error: Missing digits after the integer base prefix -WHITESPACE "\n" +NEWLINE "\n" INT_NUMBER "0xnoDigit" error: Missing digits after the integer base prefix -WHITESPACE "\n\n" +NEWLINE "\n" +NEWLINE "\n" INT_NUMBER "0xG" error: Missing digits after the integer base prefix -WHITESPACE "\n" +NEWLINE "\n" INT_NUMBER "0xg" error: Missing digits after the integer base prefix -WHITESPACE "\n\n" +NEWLINE "\n" +NEWLINE "\n" INT_NUMBER "0x_g" error: Missing digits after the integer base prefix -WHITESPACE "\n" +NEWLINE "\n" INT_NUMBER "0x_G" error: Missing digits after the integer base prefix -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/err/incomplete_frontmatter_before_unicode.rast b/crates/parser/test_data/lexer/err/incomplete_frontmatter_before_unicode.rast index f88e8d658e40..770d45e5d85c 100644 --- a/crates/parser/test_data/lexer/err/incomplete_frontmatter_before_unicode.rast +++ b/crates/parser/test_data/lexer/err/incomplete_frontmatter_before_unicode.rast @@ -1,7 +1,7 @@ MINUS "-" MINUS "-" MINUS "-" -WHITESPACE "\n" +NEWLINE "\n" MINUS "-" ERROR "│" -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/err/lifetime_starts_with_a_number.rast b/crates/parser/test_data/lexer/err/lifetime_starts_with_a_number.rast index e919bf2a4aef..2309b69d01ab 100644 --- a/crates/parser/test_data/lexer/err/lifetime_starts_with_a_number.rast +++ b/crates/parser/test_data/lexer/err/lifetime_starts_with_a_number.rast @@ -1,4 +1,4 @@ LIFETIME_IDENT "'1" error: Lifetime name cannot start with a number -WHITESPACE "\n" +NEWLINE "\n" LIFETIME_IDENT "'1lifetime" error: Lifetime name cannot start with a number -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/err/strings.rast b/crates/parser/test_data/lexer/err/strings.rast index 0cd1747208e4..4d1d9b055a41 100644 --- a/crates/parser/test_data/lexer/err/strings.rast +++ b/crates/parser/test_data/lexer/err/strings.rast @@ -1,28 +1,28 @@ STRING "\"\\💩\"" error: unknown character escape -WHITESPACE "\n" +NEWLINE "\n" STRING "\"\\●\"" error: unknown character escape -WHITESPACE "\n" +NEWLINE "\n" STRING "\"\\u{_0000}\"" error: invalid start of unicode escape -WHITESPACE "\n" +NEWLINE "\n" STRING "\"\\u{0000000}\"" error: overlong unicode escape -WHITESPACE "\n" +NEWLINE "\n" STRING "\"\\u{FFFFFF}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" STRING "\"\\u{ffffff}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" STRING "\"\\u{ffffff}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" STRING "\"\\u{DC00}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" STRING "\"\\u{DDDD}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" STRING "\"\\u{DFFF}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" STRING "\"\\u{D800}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" STRING "\"\\u{DAAA}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" STRING "\"\\u{DBFF}\"" error: invalid unicode character escape -WHITESPACE "\n" +NEWLINE "\n" STRING "\"\\xы\"" error: invalid character in numeric character escape -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/err/unterminated_string_unknown_prefix.rast b/crates/parser/test_data/lexer/err/unterminated_string_unknown_prefix.rast index f7f24ca3f810..eada6794e3c4 100644 --- a/crates/parser/test_data/lexer/err/unterminated_string_unknown_prefix.rast +++ b/crates/parser/test_data/lexer/err/unterminated_string_unknown_prefix.rast @@ -5,7 +5,8 @@ L_PAREN "(" R_PAREN ")" WHITESPACE " " L_CURLY "{" -WHITESPACE "\n " +NEWLINE "\n" +WHITESPACE " " IDENT "hello" L_PAREN "(" STRING "\"world);\n // a bunch of code was here\n env(\"FLAGS" diff --git a/crates/parser/test_data/lexer/ok/block_comment.rast b/crates/parser/test_data/lexer/ok/block_comment.rast index 18bb5cad87f0..3882a25ea349 100644 --- a/crates/parser/test_data/lexer/ok/block_comment.rast +++ b/crates/parser/test_data/lexer/ok/block_comment.rast @@ -1,6 +1,6 @@ COMMENT "/* */" -WHITESPACE "\n" +NEWLINE "\n" COMMENT "/**/" -WHITESPACE "\n" +NEWLINE "\n" COMMENT "/* /* */ */" -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/ok/byte_strings.rast b/crates/parser/test_data/lexer/ok/byte_strings.rast index fd20ca57ac6c..51c90b620c04 100644 --- a/crates/parser/test_data/lexer/ok/byte_strings.rast +++ b/crates/parser/test_data/lexer/ok/byte_strings.rast @@ -3,14 +3,14 @@ WHITESPACE " " BYTE_STRING "b\"foo\"" WHITESPACE " " BYTE_STRING "br\"\"" -WHITESPACE "\n" +NEWLINE "\n" BYTE_STRING "b\"\"ix" WHITESPACE " " BYTE_STRING "br\"\"br" -WHITESPACE "\n" +NEWLINE "\n" BYTE "b'\\n'" WHITESPACE " " BYTE "b'\\\\'" WHITESPACE " " BYTE "b'\\''" -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/ok/chars.rast b/crates/parser/test_data/lexer/ok/chars.rast index 07172a4ecc0a..3a7c8d1e8914 100644 --- a/crates/parser/test_data/lexer/ok/chars.rast +++ b/crates/parser/test_data/lexer/ok/chars.rast @@ -11,4 +11,4 @@ WHITESPACE " " CHAR "'\\\\'" WHITESPACE " " CHAR "'\\''" -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/ok/frontmatter.rast b/crates/parser/test_data/lexer/ok/frontmatter.rast index 2c7d3cdb1227..73247e3ac3c5 100644 --- a/crates/parser/test_data/lexer/ok/frontmatter.rast +++ b/crates/parser/test_data/lexer/ok/frontmatter.rast @@ -1,5 +1,5 @@ FRONTMATTER "\n---\n[dependencies]\nclap = \"4\"\n---\n" -WHITESPACE "\n" +NEWLINE "\n" FN_KW "fn" WHITESPACE " " IDENT "main" @@ -7,6 +7,6 @@ L_PAREN "(" R_PAREN ")" WHITESPACE " " L_CURLY "{" -WHITESPACE "\n" +NEWLINE "\n" R_CURLY "}" -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/ok/guarded_str_prefix_edition_2021.rast b/crates/parser/test_data/lexer/ok/guarded_str_prefix_edition_2021.rast index 1bdd6720441f..38d1fddb60e5 100644 --- a/crates/parser/test_data/lexer/ok/guarded_str_prefix_edition_2021.rast +++ b/crates/parser/test_data/lexer/ok/guarded_str_prefix_edition_2021.rast @@ -1,4 +1,5 @@ COMMENT "//@ edition: 2021" -WHITESPACE "\n\n" +NEWLINE "\n" +NEWLINE "\n" POUND "#" STRING "\"foo\"" diff --git a/crates/parser/test_data/lexer/ok/ident.rast b/crates/parser/test_data/lexer/ok/ident.rast index 5689644c07e7..b722e99df511 100644 --- a/crates/parser/test_data/lexer/ok/ident.rast +++ b/crates/parser/test_data/lexer/ok/ident.rast @@ -11,4 +11,4 @@ WHITESPACE " " IDENT "x" WHITESPACE " " IDENT "привет" -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/ok/keywords.rast b/crates/parser/test_data/lexer/ok/keywords.rast index e19b1399aa1d..94470a1afdab 100644 --- a/crates/parser/test_data/lexer/ok/keywords.rast +++ b/crates/parser/test_data/lexer/ok/keywords.rast @@ -21,7 +21,7 @@ WHITESPACE " " EXTERN_KW "extern" WHITESPACE " " CRATE_KW "crate" -WHITESPACE "\n" +NEWLINE "\n" MOD_KW "mod" WHITESPACE " " PUB_KW "pub" @@ -45,7 +45,7 @@ WHITESPACE " " MATCH_KW "match" WHITESPACE " " CONST_KW "const" -WHITESPACE "\n" +NEWLINE "\n" STATIC_KW "static" WHITESPACE " " MUT_KW "mut" @@ -61,4 +61,4 @@ WHITESPACE " " MOVE_KW "move" WHITESPACE " " RETURN_KW "return" -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/ok/lifetimes.rast b/crates/parser/test_data/lexer/ok/lifetimes.rast index eeb1e95414ea..2abc95db8a13 100644 --- a/crates/parser/test_data/lexer/ok/lifetimes.rast +++ b/crates/parser/test_data/lexer/ok/lifetimes.rast @@ -5,4 +5,4 @@ WHITESPACE " " LIFETIME_IDENT "'foo_bar_baz" WHITESPACE " " LIFETIME_IDENT "'_" -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/ok/numbers.rast b/crates/parser/test_data/lexer/ok/numbers.rast index 8d13c3f61068..65c30c930198 100644 --- a/crates/parser/test_data/lexer/ok/numbers.rast +++ b/crates/parser/test_data/lexer/ok/numbers.rast @@ -7,7 +7,7 @@ WHITESPACE " " FLOAT_NUMBER "0." WHITESPACE " " INT_NUMBER "0z" -WHITESPACE "\n" +NEWLINE "\n" INT_NUMBER "01790" WHITESPACE " " INT_NUMBER "0b1790" @@ -25,33 +25,33 @@ WHITESPACE " " FLOAT_NUMBER "0e1279" WHITESPACE " " FLOAT_NUMBER "0E1279" -WHITESPACE "\n" +NEWLINE "\n" INT_NUMBER "0" DOT "." DOT "." INT_NUMBER "2" -WHITESPACE "\n" +NEWLINE "\n" INT_NUMBER "0" DOT "." IDENT "foo" L_PAREN "(" R_PAREN ")" -WHITESPACE "\n" +NEWLINE "\n" FLOAT_NUMBER "0e+1" -WHITESPACE "\n" +NEWLINE "\n" INT_NUMBER "0" DOT "." IDENT "e" PLUS "+" INT_NUMBER "1" -WHITESPACE "\n" +NEWLINE "\n" FLOAT_NUMBER "0.0E-2" -WHITESPACE "\n" +NEWLINE "\n" FLOAT_NUMBER "0___0.10000____0000e+111__" -WHITESPACE "\n" +NEWLINE "\n" INT_NUMBER "1i64" WHITESPACE " " FLOAT_NUMBER "92.0f32" WHITESPACE " " INT_NUMBER "11__s" -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/ok/raw_ident.rast b/crates/parser/test_data/lexer/ok/raw_ident.rast index fddad998216a..613b149cf876 100644 --- a/crates/parser/test_data/lexer/ok/raw_ident.rast +++ b/crates/parser/test_data/lexer/ok/raw_ident.rast @@ -1,2 +1,2 @@ IDENT "r#raw_ident" -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/ok/raw_strings.rast b/crates/parser/test_data/lexer/ok/raw_strings.rast index 13cf733b7d17..d2c5cf83c4e3 100644 --- a/crates/parser/test_data/lexer/ok/raw_strings.rast +++ b/crates/parser/test_data/lexer/ok/raw_strings.rast @@ -1,2 +1,2 @@ STRING "r###\"this is a r##\"raw\"## string\"###" -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/ok/shebang_frontmatter.rast b/crates/parser/test_data/lexer/ok/shebang_frontmatter.rast index fb4787f4001f..f421eb48cd20 100644 --- a/crates/parser/test_data/lexer/ok/shebang_frontmatter.rast +++ b/crates/parser/test_data/lexer/ok/shebang_frontmatter.rast @@ -1,6 +1,6 @@ SHEBANG "#!/usr/bin/env cargo\n" FRONTMATTER "\n---\n[dependencies]\nclap = \"4\"\n---\n" -WHITESPACE "\n" +NEWLINE "\n" FN_KW "fn" WHITESPACE " " IDENT "main" @@ -8,6 +8,6 @@ L_PAREN "(" R_PAREN ")" WHITESPACE " " L_CURLY "{" -WHITESPACE "\n" +NEWLINE "\n" R_CURLY "}" -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/ok/single_line_comments.rast b/crates/parser/test_data/lexer/ok/single_line_comments.rast index 17ef356156f7..f65b7b24bd15 100644 --- a/crates/parser/test_data/lexer/ok/single_line_comments.rast +++ b/crates/parser/test_data/lexer/ok/single_line_comments.rast @@ -1,21 +1,22 @@ SHEBANG "#!/usr/bin/env bash\n" COMMENT "// hello" -WHITESPACE "\n" +NEWLINE "\n" INNER_DOC_COMMENT "//! World" -WHITESPACE "\n" +NEWLINE "\n" INNER_DOC_COMMENT "//!! Inner line doc" -WHITESPACE "\n" +NEWLINE "\n" OUTER_DOC_COMMENT "/// Outer line doc" -WHITESPACE "\n" +NEWLINE "\n" COMMENT "//// Just a comment" -WHITESPACE "\n\n" +NEWLINE "\n" +NEWLINE "\n" COMMENT "//" -WHITESPACE "\n" +NEWLINE "\n" INNER_DOC_COMMENT "//!" -WHITESPACE "\n" +NEWLINE "\n" INNER_DOC_COMMENT "//!!" -WHITESPACE "\n" +NEWLINE "\n" OUTER_DOC_COMMENT "///" -WHITESPACE "\n" +NEWLINE "\n" COMMENT "////" -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/ok/strings.rast b/crates/parser/test_data/lexer/ok/strings.rast index ec222591bd39..de76b775d12b 100644 --- a/crates/parser/test_data/lexer/ok/strings.rast +++ b/crates/parser/test_data/lexer/ok/strings.rast @@ -5,4 +5,4 @@ WHITESPACE " " STRING "\"\\n\\\"\\\\no escape\"" WHITESPACE " " STRING "\"multi\nline\"" -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/ok/symbols.rast b/crates/parser/test_data/lexer/ok/symbols.rast index 533ccff9a873..9bc6a79254d2 100644 --- a/crates/parser/test_data/lexer/ok/symbols.rast +++ b/crates/parser/test_data/lexer/ok/symbols.rast @@ -41,7 +41,7 @@ WHITESPACE " " CARET "^" WHITESPACE " " PERCENT "%" -WHITESPACE "\n" +NEWLINE "\n" DOT "." WHITESPACE " " DOT "." @@ -54,24 +54,24 @@ WHITESPACE " " DOT "." DOT "." EQ "=" -WHITESPACE "\n" +NEWLINE "\n" COLON ":" WHITESPACE " " COLON ":" COLON ":" -WHITESPACE "\n" +NEWLINE "\n" EQ "=" WHITESPACE " " EQ "=" R_ANGLE ">" -WHITESPACE "\n" +NEWLINE "\n" BANG "!" WHITESPACE " " BANG "!" EQ "=" -WHITESPACE "\n" +NEWLINE "\n" MINUS "-" WHITESPACE " " MINUS "-" R_ANGLE ">" -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/lexer/ok/whitespace.rast b/crates/parser/test_data/lexer/ok/whitespace.rast index 8ccb79e4ec74..c2c65092fa26 100644 --- a/crates/parser/test_data/lexer/ok/whitespace.rast +++ b/crates/parser/test_data/lexer/ok/whitespace.rast @@ -3,10 +3,11 @@ WHITESPACE " " IDENT "b" WHITESPACE " " IDENT "c" -WHITESPACE "\n" +NEWLINE "\n" IDENT "d" -WHITESPACE "\n\n" +NEWLINE "\n" +NEWLINE "\n" IDENT "e" WHITESPACE "\t" IDENT "f" -WHITESPACE "\n" +NEWLINE "\n" diff --git a/crates/parser/test_data/parser/err/0000_struct_field_missing_comma.rast b/crates/parser/test_data/parser/err/0000_struct_field_missing_comma.rast index b30328c8270c..03cc80ddc9df 100644 --- a/crates/parser/test_data/parser/err/0000_struct_field_missing_comma.rast +++ b/crates/parser/test_data/parser/err/0000_struct_field_missing_comma.rast @@ -1,34 +1,28 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RECORD_FIELD NAME - IDENT "a" - COLON ":" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u32" - WHITESPACE "\n " + IDENT "u32" [] [NEWLINE("\n")] RECORD_FIELD NAME - IDENT "b" - COLON ":" - WHITESPACE " " + IDENT "b" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u32" - WHITESPACE "\n" + IDENT "u32" [] [NEWLINE("\n")] R_CURLY "}" + EOF "" error 21: expected COMMA diff --git a/crates/parser/test_data/parser/err/0001_item_recovery_in_file.rast b/crates/parser/test_data/parser/err/0001_item_recovery_in_file.rast index 959b87ebbc59..60e4d8bcc035 100644 --- a/crates/parser/test_data/parser/err/0001_item_recovery_in_file.rast +++ b/crates/parser/test_data/parser/err/0001_item_recovery_in_file.rast @@ -1,18 +1,15 @@ SOURCE_FILE ERROR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [] [WHITESPACE(" ")] ERROR - MATCH_KW "match" - WHITESPACE "\n\n" + MATCH_KW "match" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [NEWLINE("\n")] [WHITESPACE(" ")] NAME - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_FIELD_LIST L_CURLY "{" R_CURLY "}" + EOF "" error 0: expected an item error 3: expected an item diff --git a/crates/parser/test_data/parser/err/0002_duplicate_shebang.rast b/crates/parser/test_data/parser/err/0002_duplicate_shebang.rast index 60cc690f7c98..eb3cb1b407b4 100644 --- a/crates/parser/test_data/parser/err/0002_duplicate_shebang.rast +++ b/crates/parser/test_data/parser/err/0002_duplicate_shebang.rast @@ -20,14 +20,13 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "env" - WHITESPACE " " + IDENT "env" [] [WHITESPACE(" ")] ERROR PATH PATH_SEGMENT NAME_REF - IDENT "rusti" - WHITESPACE "\n" + IDENT "rusti" [] [NEWLINE("\n")] + EOF "" error 23: expected L_BRACK error 23: expected an item error 27: expected one of `*`, `::`, `{`, `self`, `super` or an identifier diff --git a/crates/parser/test_data/parser/err/0003_C++_semicolon.rast b/crates/parser/test_data/parser/err/0003_C++_semicolon.rast index 00131bea51d6..4fe613a53786 100644 --- a/crates/parser/test_data/parser/err/0003_C++_semicolon.rast +++ b/crates/parser/test_data/parser/err/0003_C++_semicolon.rast @@ -1,39 +1,33 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RECORD_FIELD NAME - IDENT "a" - COLON ":" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] RECORD_FIELD NAME - IDENT "b" - COLON ":" - WHITESPACE " " + IDENT "b" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "String" - COMMA "," - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] R_CURLY "}" ERROR SEMICOLON ";" + EOF "" error 39: expected item, found `;` consider removing this semicolon diff --git a/crates/parser/test_data/parser/err/0004_use_path_bad_segment.rast b/crates/parser/test_data/parser/err/0004_use_path_bad_segment.rast index 7273c98456ee..406526727946 100644 --- a/crates/parser/test_data/parser/err/0004_use_path_bad_segment.rast +++ b/crates/parser/test_data/parser/err/0004_use_path_bad_segment.rast @@ -1,7 +1,6 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -13,4 +12,5 @@ SOURCE_FILE ERROR INT_NUMBER "92" SEMICOLON ";" + EOF "" error 9: expected identifier, `self`, `super`, `crate`, or `Self` diff --git a/crates/parser/test_data/parser/err/0005_attribute_recover.rast b/crates/parser/test_data/parser/err/0005_attribute_recover.rast index cf45dcf522ad..e53797fd556a 100644 --- a/crates/parser/test_data/parser/err/0005_attribute_recover.rast +++ b/crates/parser/test_data/parser/err/0005_attribute_recover.rast @@ -11,31 +11,24 @@ SOURCE_FILE TOKEN_TREE L_PAREN "(" IDENT "foo" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PLUS "+" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] INT_NUMBER "92" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" - FN_KW "fn" - WHITESPACE " " + R_BRACK "]" [] [NEWLINE("\n")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] ATTR - POUND "#" + POUND "#" [NEWLINE("\n"), NEWLINE("\n")] [] L_BRACK "[" TOKEN_TREE_META PATH @@ -43,20 +36,16 @@ SOURCE_FILE NAME_REF IDENT "foo" TOKEN_TREE - L_PAREN "(" - WHITESPACE "\n" - FN_KW "fn" - WHITESPACE " " + L_PAREN "(" [] [NEWLINE("\n")] + FN_KW "fn" [] [WHITESPACE(" ")] IDENT "foo" TOKEN_TREE L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] TOKEN_TREE - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 53: expected R_PAREN error 53: expected R_BRACK error 53: expected an item diff --git a/crates/parser/test_data/parser/err/0006_named_field_recovery.rast b/crates/parser/test_data/parser/err/0006_named_field_recovery.rast index 7a4aa93b2465..f0dbe6e34569 100644 --- a/crates/parser/test_data/parser/err/0006_named_field_recovery.rast +++ b/crates/parser/test_data/parser/err/0006_named_field_recovery.rast @@ -1,69 +1,54 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RECORD_FIELD NAME - IDENT "f" - COLON ":" - WHITESPACE " " + IDENT "f" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u32" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] VISIBILITY - PUB_KW "pub" - WHITESPACE " " + PUB_KW "pub" [WHITESPACE(" ")] [WHITESPACE(" ")] ERROR - INT_NUMBER "92" - WHITESPACE "\n " + INT_NUMBER "92" [] [NEWLINE("\n")] ERROR - PLUS "+" - WHITESPACE " " + PLUS "+" [WHITESPACE(" ")] [WHITESPACE(" ")] ERROR - MINUS "-" - WHITESPACE " " + MINUS "-" [] [WHITESPACE(" ")] ERROR - STAR "*" - WHITESPACE "\n " + STAR "*" [] [NEWLINE("\n")] RECORD_FIELD VISIBILITY - PUB_KW "pub" - WHITESPACE " " + PUB_KW "pub" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u32" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] RECORD_FIELD NAME - IDENT "z" - COLON ":" - WHITESPACE " " + IDENT "z" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "f64" - COMMA "," - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 31: expected field declaration error 33: expected COMMA error 38: expected field declaration diff --git a/crates/parser/test_data/parser/err/0007_stray_curly_in_file.rast b/crates/parser/test_data/parser/err/0007_stray_curly_in_file.rast index 5d87ff866b25..32215c47d851 100644 --- a/crates/parser/test_data/parser/err/0007_stray_curly_in_file.rast +++ b/crates/parser/test_data/parser/err/0007_stray_curly_in_file.rast @@ -1,20 +1,15 @@ SOURCE_FILE ERROR - R_CURLY "}" - WHITESPACE "\n\n" + R_CURLY "}" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "S" - SEMICOLON ";" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] ERROR - R_CURLY "}" - WHITESPACE "\n\n" + R_CURLY "}" [NEWLINE("\n")] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST @@ -23,11 +18,10 @@ SOURCE_FILE BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n\n" + R_CURLY "}" [] [NEWLINE("\n")] ERROR - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [NEWLINE("\n")] [NEWLINE("\n")] + EOF "" error 0: unmatched `}` error 14: unmatched `}` error 29: unmatched `}` diff --git a/crates/parser/test_data/parser/err/0008_item_block_recovery.rast b/crates/parser/test_data/parser/err/0008_item_block_recovery.rast index 2a296fe4aa0d..993fdef435ab 100644 --- a/crates/parser/test_data/parser/err/0008_item_block_recovery.rast +++ b/crates/parser/test_data/parser/err/0008_item_block_recovery.rast @@ -1,81 +1,60 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] ERROR PATH PATH_SEGMENT NAME_REF - IDENT "bar" + IDENT "bar" [NEWLINE("\n")] [] ERROR L_PAREN "(" ERROR - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] ERROR - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LITERAL - INT_NUMBER "1" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE " " - ELSE_KW "else" - WHITESPACE " " + INT_NUMBER "1" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [WHITESPACE(" ")] + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] BIN_EXPR LITERAL - INT_NUMBER "2" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + INT_NUMBER "2" [WHITESPACE(" ")] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "3" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + INT_NUMBER "3" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "baz" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 17: expected an item error 17: expected an item error 18: expected an item diff --git a/crates/parser/test_data/parser/err/0009_broken_struct_type_parameter.rast b/crates/parser/test_data/parser/err/0009_broken_struct_type_parameter.rast index cdc01863ab04..42789a3c5974 100644 --- a/crates/parser/test_data/parser/err/0009_broken_struct_type_parameter.rast +++ b/crates/parser/test_data/parser/err/0009_broken_struct_type_parameter.rast @@ -1,49 +1,40 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" GENERIC_PARAM_LIST L_ANGLE "<" ERROR - INT_NUMBER "90" - WHITESPACE " " + INT_NUMBER "90" [] [WHITESPACE(" ")] ERROR - PLUS "+" - WHITESPACE " " + PLUS "+" [] [WHITESPACE(" ")] ERROR INT_NUMBER "2" ERROR - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] ERROR - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "f" + IDENT "f" [WHITESPACE(" ")] [] ERROR - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "u32" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + IDENT "u32" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "T" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 9: expected generic parameter error 11: expected R_ANGLE error 11: expected `;`, `{`, or `(` diff --git a/crates/parser/test_data/parser/err/0010_unsafe_lambda_block.rast b/crates/parser/test_data/parser/err/0010_unsafe_lambda_block.rast index 9427ee5c0e52..864fb317f64a 100644 --- a/crates/parser/test_data/parser/err/0010_unsafe_lambda_block.rast +++ b/crates/parser/test_data/parser/err/0010_unsafe_lambda_block.rast @@ -1,45 +1,35 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT CLOSURE_EXPR PARAM_LIST - PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [WHITESPACE(" ")] [] + PIPE "|" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] EXPR_STMT BLOCK_EXPR - UNSAFE_KW "unsafe" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 24: expected a block error 24: expected SEMICOLON diff --git a/crates/parser/test_data/parser/err/0011_extern_struct.rast b/crates/parser/test_data/parser/err/0011_extern_struct.rast index 249bfeeeeee3..cbf44136a337 100644 --- a/crates/parser/test_data/parser/err/0011_extern_struct.rast +++ b/crates/parser/test_data/parser/err/0011_extern_struct.rast @@ -1,13 +1,11 @@ SOURCE_FILE ERROR ABI - EXTERN_KW "extern" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "Foo" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 6: expected fn, trait or impl diff --git a/crates/parser/test_data/parser/err/0013_invalid_type.rast b/crates/parser/test_data/parser/err/0013_invalid_type.rast index 8c8debb8b09a..454494f0428f 100644 --- a/crates/parser/test_data/parser/err/0013_invalid_type.rast +++ b/crates/parser/test_data/parser/err/0013_invalid_type.rast @@ -1,21 +1,18 @@ SOURCE_FILE STRUCT VISIBILITY - PUB_KW "pub" - WHITESPACE " " - STRUCT_KW "struct" - WHITESPACE " " + PUB_KW "pub" [] [WHITESPACE(" ")] + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "Cache" TUPLE_FIELD_LIST - L_PAREN "(" - WHITESPACE "\n " + L_PAREN "(" [] [NEWLINE("\n")] TUPLE_FIELD PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "RefCell" + IDENT "RefCell" [WHITESPACE(" ")] [] GENERIC_ARG_LIST L_ANGLE "<" TYPE_ARG @@ -25,27 +22,24 @@ SOURCE_FILE NAME_REF IDENT "HashMap" GENERIC_ARG_LIST - L_ANGLE "<" - WHITESPACE "\n " + L_ANGLE "<" [] [NEWLINE("\n")] TYPE_ARG PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "TypeId" - COMMA "," - WHITESPACE "\n " + IDENT "TypeId" [WHITESPACE(" ")] [] + COMMA "," [] [NEWLINE("\n")] TYPE_ARG PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Box" + IDENT "Box" [WHITESPACE(" ")] [] GENERIC_ARG_LIST L_ANGLE "<" ERROR - AT "@" - WHITESPACE " " + AT "@" [] [WHITESPACE(" ")] ERROR PATH PATH_SEGMENT @@ -54,18 +48,16 @@ SOURCE_FILE ERROR R_ANGLE ">" ERROR - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] ERROR - R_ANGLE ">" + R_ANGLE ">" [WHITESPACE(" ")] [] ERROR - R_ANGLE ">" - WHITESPACE "\n" + R_ANGLE ">" [] [NEWLINE("\n")] ERROR R_PAREN ")" ERROR - SEMICOLON ";" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" [NEWLINE("\n")] [] error 67: expected R_ANGLE error 67: expected R_ANGLE error 67: expected R_ANGLE diff --git a/crates/parser/test_data/parser/err/0014_where_no_bounds.rast b/crates/parser/test_data/parser/err/0014_where_no_bounds.rast index fd2f9ada33db..6e6f7c935b6b 100644 --- a/crates/parser/test_data/parser/err/0014_where_no_bounds.rast +++ b/crates/parser/test_data/parser/err/0014_where_no_bounds.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" GENERIC_PARAM_LIST @@ -12,21 +11,18 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE " " + WHERE_KW "where" [] [WHITESPACE(" ")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "T" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 19: expected colon diff --git a/crates/parser/test_data/parser/err/0015_curly_in_params.rast b/crates/parser/test_data/parser/err/0015_curly_in_params.rast index 8e169320d954..58de9fd28d60 100644 --- a/crates/parser/test_data/parser/err/0015_curly_in_params.rast +++ b/crates/parser/test_data/parser/err/0015_curly_in_params.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST @@ -9,13 +8,11 @@ SOURCE_FILE ERROR R_CURLY "}" ERROR - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] ERROR - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 7: expected value parameter error 7: expected R_PAREN error 7: expected a block diff --git a/crates/parser/test_data/parser/err/0016_missing_semi.rast b/crates/parser/test_data/parser/err/0016_missing_semi.rast index c48c35bf822a..255683ea81e8 100644 --- a/crates/parser/test_data/parser/err/0016_missing_semi.rast +++ b/crates/parser/test_data/parser/err/0016_missing_semi.rast @@ -1,44 +1,35 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "foo" + IDENT "foo" [WHITESPACE(" ")] [] ARG_LIST - L_PAREN "(" - WHITESPACE "\n " + L_PAREN "(" [] [NEWLINE("\n")] LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " + INT_NUMBER "1" [WHITESPACE(" ")] [] + COMMA "," [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "2" - WHITESPACE "\n " - R_PAREN ")" - WHITESPACE "\n " + INT_NUMBER "2" [] [NEWLINE("\n")] + R_PAREN ")" [WHITESPACE(" ")] [NEWLINE("\n")] EXPR_STMT RETURN_EXPR - RETURN_KW "return" - WHITESPACE " " + RETURN_KW "return" [WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL INT_NUMBER "92" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 38: expected SEMICOLON diff --git a/crates/parser/test_data/parser/err/0017_incomplete_binexpr.rast b/crates/parser/test_data/parser/err/0017_incomplete_binexpr.rast index 80735646290b..b745d4b0a315 100644 --- a/crates/parser/test_data/parser/err/0017_incomplete_binexpr.rast +++ b/crates/parser/test_data/parser/err/0017_incomplete_binexpr.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST @@ -10,38 +9,29 @@ SOURCE_FILE IDENT_PAT NAME IDENT "foo" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "bar" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "bar" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "92" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - PLUS "+" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + INT_NUMBER "1" [WHITESPACE(" ")] [WHITESPACE(" ")] + PLUS "+" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 44: expected expression diff --git a/crates/parser/test_data/parser/err/0018_incomplete_fn.rast b/crates/parser/test_data/parser/err/0018_incomplete_fn.rast index 6524d8e8fa9f..7fa6e0b44edb 100644 --- a/crates/parser/test_data/parser/err/0018_incomplete_fn.rast +++ b/crates/parser/test_data/parser/err/0018_incomplete_fn.rast @@ -1,19 +1,15 @@ SOURCE_FILE IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "FnScopes" - WHITESPACE " " + IDENT "FnScopes" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "new_scope" PARAM_LIST @@ -21,30 +17,23 @@ SOURCE_FILE PARAM REF_PAT AMP "&" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "ScopeId" - WHITESPACE " " + IDENT "ScopeId" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "res" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "res" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] METHOD_CALL_EXPR FIELD_EXPR PATH_EXPR @@ -61,15 +50,14 @@ SOURCE_FILE ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] METHOD_CALL_EXPR FIELD_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - SELF_KW "self" + SELF_KW "self" [WHITESPACE(" ")] [] DOT "." NAME_REF IDENT "scopes" @@ -82,28 +70,23 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "ScopeData" - WHITESPACE " " + IDENT "ScopeData" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD NAME_REF IDENT "parent" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "None" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] RECORD_EXPR_FIELD NAME_REF IDENT "entries" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] MACRO_EXPR MACRO_CALL PATH @@ -113,21 +96,16 @@ SOURCE_FILE BANG "!" TOKEN_TREE L_BRACK "[" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] R_CURLY "}" - R_PAREN ")" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " + R_PAREN ")" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] NAME - IDENT "set_parent" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + IDENT "set_parent" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 34: expected pattern error 34: missing type for function parameter error 180: expected function arguments diff --git a/crates/parser/test_data/parser/err/0019_let_recover.rast b/crates/parser/test_data/parser/err/0019_let_recover.rast index 7d62e0cc14f5..7d6043e71ad8 100644 --- a/crates/parser/test_data/parser/err/0019_let_recover.rast +++ b/crates/parser/test_data/parser/err/0019_let_recover.rast @@ -1,101 +1,74 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "11" - WHITESPACE "\n " + INT_NUMBER "11" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "bar" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "bar" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE "\n " + LET_KW "let" [WHITESPACE(" ")] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "baz" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "baz" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "92" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE "\n " + LET_KW "let" [WHITESPACE(" ")] [NEWLINE("\n")] EXPR_STMT IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE "\n " + LET_KW "let" [WHITESPACE(" ")] [NEWLINE("\n")] EXPR_STMT WHILE_EXPR - WHILE_KW "while" - WHITESPACE " " + WHILE_KW "while" [WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE "\n " + LET_KW "let" [WHITESPACE(" ")] [NEWLINE("\n")] LOOP_EXPR - LOOP_KW "loop" - WHITESPACE " " + LOOP_KW "loop" [WHITESPACE(" ")] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 27: expected SEMICOLON error 52: expected pattern error 52: expected SEMICOLON diff --git a/crates/parser/test_data/parser/err/0020_fn_recover.rast b/crates/parser/test_data/parser/err/0020_fn_recover.rast index 56d124cb95b2..eb648f6d93ef 100644 --- a/crates/parser/test_data/parser/err/0020_fn_recover.rast +++ b/crates/parser/test_data/parser/err/0020_fn_recover.rast @@ -1,21 +1,18 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE "\n\n" + FN_KW "fn" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 2: expected a name error 2: expected function arguments error 2: expected a block diff --git a/crates/parser/test_data/parser/err/0021_incomplete_param.rast b/crates/parser/test_data/parser/err/0021_incomplete_param.rast index 762840aa2a94..b79f2f4ce9d3 100644 --- a/crates/parser/test_data/parser/err/0021_incomplete_param.rast +++ b/crates/parser/test_data/parser/err/0021_incomplete_param.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST @@ -10,25 +9,21 @@ SOURCE_FILE IDENT_PAT NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "y" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 16: missing type for function parameter diff --git a/crates/parser/test_data/parser/err/0022_bad_exprs.rast b/crates/parser/test_data/parser/err/0022_bad_exprs.rast index 1a8e881dd9e0..2e4a9e5f0a56 100644 --- a/crates/parser/test_data/parser/err/0022_bad_exprs.rast +++ b/crates/parser/test_data/parser/err/0022_bad_exprs.rast @@ -1,58 +1,46 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "a" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT ARRAY_EXPR L_BRACK "[" LITERAL INT_NUMBER "1" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ERROR AT "@" ERROR - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] STRUCT STRUCT_KW "struct" ERROR - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LET_STMT LET_KW "let" ERROR - R_BRACK "]" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + R_BRACK "]" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "b" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT CALL_EXPR PATH_EXPR @@ -64,42 +52,33 @@ SOURCE_FILE L_PAREN "(" LITERAL INT_NUMBER "1" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ERROR AT "@" ERROR - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IMPL IMPL_KW "impl" ERROR - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LET_STMT LET_KW "let" ERROR - R_PAREN ")" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + R_PAREN ")" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "c" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT METHOD_CALL_EXPR PATH_EXPR @@ -114,34 +93,28 @@ SOURCE_FILE L_PAREN "(" LITERAL INT_NUMBER "1" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ERROR AT "@" ERROR - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ERROR R_BRACK "]" ERROR - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TRAIT TRAIT_KW "trait" ERROR - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LET_STMT LET_KW "let" ERROR - R_PAREN ")" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + R_PAREN ")" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 16: expected expression error 17: expected R_BRACK error 17: expected SEMICOLON diff --git a/crates/parser/test_data/parser/err/0023_mismatched_paren.rast b/crates/parser/test_data/parser/err/0023_mismatched_paren.rast index 4064a7a1ff2d..83145b3810ca 100644 --- a/crates/parser/test_data/parser/err/0023_mismatched_paren.rast +++ b/crates/parser/test_data/parser/err/0023_mismatched_paren.rast @@ -1,45 +1,33 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MACRO_EXPR MACRO_CALL PATH PATH_SEGMENT NAME_REF - IDENT "foo" - BANG "!" - WHITESPACE " " + IDENT "foo" [WHITESPACE(" ")] [] + BANG "!" [] [WHITESPACE(" ")] TOKEN_TREE - L_PAREN "(" - WHITESPACE "\n " - IDENT "bar" - COMMA "," - WHITESPACE " " + L_PAREN "(" [] [NEWLINE("\n")] + IDENT "bar" [WHITESPACE(" ")] [] + COMMA "," [] [WHITESPACE(" ")] STRING "\"baz\"" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] INT_NUMBER "1" - COMMA "," - WHITESPACE " " - FLOAT_NUMBER "2.0" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE " " - COMMENT "//~ ERROR incorrect close delimiter" - WHITESPACE "\n" + COMMA "," [] [WHITESPACE(" ")] + FLOAT_NUMBER "2.0" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [WHITESPACE(" "), COMMENT("//~ ERROR incorrect close delimiter"), NEWLINE("\n")] ERROR - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 49: unmatched `}` error 92: unmatched `}` diff --git a/crates/parser/test_data/parser/err/0024_many_type_parens.rast b/crates/parser/test_data/parser/err/0024_many_type_parens.rast index 2fd172539e41..e01949b33a0a 100644 --- a/crates/parser/test_data/parser/err/0024_many_type_parens.rast +++ b/crates/parser/test_data/parser/err/0024_many_type_parens.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" GENERIC_PARAM_LIST @@ -9,8 +8,7 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND L_PAREN "(" @@ -19,10 +17,8 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Copy" - R_PAREN ")" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND L_PAREN "(" QUESTION "?" @@ -31,10 +27,8 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Sized" - R_PAREN ")" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND L_PAREN "(" FOR_BINDER @@ -44,8 +38,7 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -61,33 +54,26 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] DYN_TRAIT_TYPE TYPE_BOUND_LIST TYPE_BOUND @@ -106,10 +92,8 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Copy" - R_PAREN ")" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND L_PAREN "(" QUESTION "?" @@ -118,10 +102,8 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Sized" - R_PAREN ")" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND L_PAREN "(" FOR_BINDER @@ -131,8 +113,7 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -147,15 +128,12 @@ SOURCE_FILE R_PAREN ")" ERROR R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -175,11 +153,9 @@ SOURCE_FILE NAME_REF IDENT "Sized" ERROR - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] ERROR - PLUS "+" - WHITESPACE " " + PLUS "+" [] [WHITESPACE(" ")] EXPR_STMT BIN_EXPR BIN_EXPR @@ -193,8 +169,7 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] BIN_EXPR BIN_EXPR PATH_EXPR @@ -206,10 +181,8 @@ SOURCE_FILE ERROR LIFETIME_IDENT "'a" R_ANGLE ">" - R_PAREN ")" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] PAREN_EXPR L_PAREN "(" PATH_EXPR @@ -220,15 +193,12 @@ SOURCE_FILE R_PAREN ")" R_ANGLE ">" ERROR - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] DYN_TRAIT_TYPE TYPE_BOUND_LIST TYPE_BOUND @@ -250,8 +220,7 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -263,10 +232,8 @@ SOURCE_FILE LIFETIME LIFETIME_IDENT "'a" R_ANGLE ">" - R_PAREN ")" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND L_PAREN "(" PATH_TYPE @@ -274,10 +241,8 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Copy" - R_PAREN ")" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND L_PAREN "(" QUESTION "?" @@ -289,10 +254,9 @@ SOURCE_FILE R_PAREN ")" ERROR R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 88: expected R_ANGLE error 121: expected SEMICOLON error 121: expected expression, item or let statement diff --git a/crates/parser/test_data/parser/err/0025_nope.rast b/crates/parser/test_data/parser/err/0025_nope.rast index 23964ab9d9b3..35884f1c038b 100644 --- a/crates/parser/test_data/parser/err/0025_nope.rast +++ b/crates/parser/test_data/parser/err/0025_nope.rast @@ -1,34 +1,27 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] ENUM - ENUM_KW "enum" - WHITESPACE " " + ENUM_KW "enum" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME - IDENT "Test" - WHITESPACE " " + IDENT "Test" [] [WHITESPACE(" ")] VARIANT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] VARIANT NAME - IDENT "Var1" - COMMA "," - WHITESPACE "\n " + IDENT "Var1" [WHITESPACE(" ")] [] + COMMA "," [] [NEWLINE("\n")] VARIANT NAME - IDENT "Var2" + IDENT "Var2" [WHITESPACE(" ")] [] TUPLE_FIELD_LIST L_PAREN "(" TUPLE_FIELD @@ -38,116 +31,81 @@ SOURCE_FILE NAME_REF IDENT "String" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] VARIANT NAME - IDENT "Var3" - WHITESPACE " " + IDENT "Var3" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RECORD_FIELD NAME - IDENT "abc" - COLON ":" - WHITESPACE " " + IDENT "abc" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] ERROR L_CURLY "{" R_CURLY "}" ERROR - COMMA "," - WHITESPACE " " - COMMENT "//~ ERROR: expected type, found `{`" - WHITESPACE "\n " - R_CURLY "}" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " - COMMENT "// recover..." - WHITESPACE "\n " + COMMA "," [] [WHITESPACE(" "), COMMENT("//~ ERROR: expected type, found `{`"), NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [] + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [NEWLINE("\n"), WHITESPACE(" "), COMMENT("// recover..."), NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] ENUM - ENUM_KW "enum" - WHITESPACE " " + ENUM_KW "enum" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME - IDENT "Test2" - WHITESPACE " " + IDENT "Test2" [] [WHITESPACE(" ")] VARIANT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] VARIANT NAME - IDENT "Fine" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " + IDENT "Fine" [WHITESPACE(" ")] [] + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] ENUM - ENUM_KW "enum" - WHITESPACE " " + ENUM_KW "enum" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] NAME - IDENT "Test3" - WHITESPACE " " + IDENT "Test3" [] [WHITESPACE(" ")] VARIANT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] VARIANT NAME - IDENT "StillFine" - WHITESPACE " " + IDENT "StillFine" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RECORD_FIELD NAME - IDENT "def" - COLON ":" - WHITESPACE " " + IDENT "def" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [] + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [NEWLINE("\n"), WHITESPACE(" ")] [NEWLINE("\n")] ENUM - COMMENT "// fail again" - WHITESPACE "\n " - ENUM_KW "enum" - WHITESPACE " " + ENUM_KW "enum" [WHITESPACE(" "), COMMENT("// fail again"), NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] NAME - IDENT "Test4" - WHITESPACE " " + IDENT "Test4" [] [WHITESPACE(" ")] VARIANT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] VARIANT NAME - IDENT "Nope" + IDENT "Nope" [WHITESPACE(" ")] [] TUPLE_FIELD_LIST L_PAREN "(" TUPLE_FIELD @@ -155,45 +113,28 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " + IDENT "i32" [] [WHITESPACE(" ")] ERROR L_CURLY "{" R_CURLY "}" ERROR - R_PAREN ")" - WHITESPACE " " - COMMENT "//~ ERROR: found `{`" - WHITESPACE "\n " - COMMENT "//~^ ERROR: found `{`" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n " - COMMENT "// still recover later" - WHITESPACE "\n " + R_PAREN ")" [] [WHITESPACE(" "), COMMENT("//~ ERROR: found `{`"), NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" "), COMMENT("//~^ ERROR: found `{`"), NEWLINE("\n"), WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] LET_STMT - LET_KW "let" + LET_KW "let" [WHITESPACE(" "), COMMENT("// still recover later"), NEWLINE("\n"), WHITESPACE(" ")] [] ERROR - SEMICOLON ";" - WHITESPACE " " - COMMENT "//~ ERROR: expected pattern" - WHITESPACE "\n " + SEMICOLON ";" [] [WHITESPACE(" "), COMMENT("//~ ERROR: expected pattern"), NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 95: expected type, found `{` error 95: expected COMMA error 96: expected field diff --git a/crates/parser/test_data/parser/err/0026_imp_recovery.rast b/crates/parser/test_data/parser/err/0026_imp_recovery.rast index 1068418e0d84..3a9d019134b9 100644 --- a/crates/parser/test_data/parser/err/0026_imp_recovery.rast +++ b/crates/parser/test_data/parser/err/0026_imp_recovery.rast @@ -6,8 +6,7 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -15,8 +14,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Clone" - R_ANGLE ">" - WHITESPACE "\n" + R_ANGLE ">" [] [NEWLINE("\n")] IMPL IMPL_KW "impl" GENERIC_PARAM_LIST @@ -24,8 +22,7 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -39,11 +36,10 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "T" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 14: expected trait or type error 14: expected `{` diff --git a/crates/parser/test_data/parser/err/0027_incomplete_where_for.rast b/crates/parser/test_data/parser/err/0027_incomplete_where_for.rast index 31db794d9f12..77f756914e68 100644 --- a/crates/parser/test_data/parser/err/0027_incomplete_where_for.rast +++ b/crates/parser/test_data/parser/err/0027_incomplete_where_for.rast @@ -1,16 +1,13 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n " + R_PAREN ")" [] [NEWLINE("\n")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE " " + WHERE_KW "where" [WHITESPACE(" ")] [WHITESPACE(" ")] WHERE_PRED FOR_BINDER FOR_KW "for" @@ -19,12 +16,11 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE "\n" + R_ANGLE ">" [] [NEWLINE("\n")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 26: expected type, found `{` error 26: expected colon diff --git a/crates/parser/test_data/parser/err/0029_field_completion.rast b/crates/parser/test_data/parser/err/0029_field_completion.rast index fb037112fa3f..640941b6b334 100644 --- a/crates/parser/test_data/parser/err/0029_field_completion.rast +++ b/crates/parser/test_data/parser/err/0029_field_completion.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST @@ -10,27 +9,23 @@ SOURCE_FILE IDENT_PAT NAME IDENT "a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "A" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FIELD_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - DOT "." - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + IDENT "a" [WHITESPACE(" ")] [] + DOT "." [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 21: expected field name or number diff --git a/crates/parser/test_data/parser/err/0032_match_arms_inner_attrs.rast b/crates/parser/test_data/parser/err/0032_match_arms_inner_attrs.rast index 234070bcb135..b39ded181485 100644 --- a/crates/parser/test_data/parser/err/0032_match_arms_inner_attrs.rast +++ b/crates/parser/test_data/parser/err/0032_match_arms_inner_attrs.rast @@ -1,42 +1,33 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] NOT_NULL BANG "!" SLICE_PAT @@ -51,57 +42,43 @@ SOURCE_FILE LITERAL STRING "\"Not allowed here\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " + R_BRACK "]" [] [NEWLINE("\n")] UNDERSCORE_EXPR - UNDERSCORE "_" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] MATCH_ARM - FAT_ARROW "=>" - WHITESPACE " " + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] NOT_NULL BANG "!" SLICE_PAT @@ -116,23 +93,18 @@ SOURCE_FILE LITERAL STRING "\"Nor here\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " + R_BRACK "]" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] L_BRACK "[" CFG_META CFG_KW "cfg" @@ -140,10 +112,9 @@ SOURCE_FILE CFG_ATOM IDENT "test" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " + R_BRACK "]" [] [NEWLINE("\n")] ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] NOT_NULL BANG "!" SLICE_PAT @@ -158,34 +129,26 @@ SOURCE_FILE LITERAL STRING "\"Nor here\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " + R_BRACK "]" [] [NEWLINE("\n")] UNDERSCORE_EXPR - UNDERSCORE "_" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] MATCH_ARM - FAT_ARROW "=>" - WHITESPACE " " + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 52: expected L_BRACK error 78: expected FAT_ARROW error 88: expected `,` diff --git a/crates/parser/test_data/parser/err/0033_match_arms_outer_attrs.rast b/crates/parser/test_data/parser/err/0033_match_arms_outer_attrs.rast index acacee234826..27c87ea703c3 100644 --- a/crates/parser/test_data/parser/err/0033_match_arms_outer_attrs.rast +++ b/crates/parser/test_data/parser/err/0033_match_arms_outer_attrs.rast @@ -1,52 +1,40 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] L_BRACK "[" CFG_META CFG_KW "cfg" @@ -54,12 +42,10 @@ SOURCE_FILE CFG_ATOM IDENT "test" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 80: expected pattern error 80: expected FAT_ARROW error 80: expected expression diff --git a/crates/parser/test_data/parser/err/0034_bad_box_pattern.rast b/crates/parser/test_data/parser/err/0034_bad_box_pattern.rast index 7a2ae9103fd9..14909be0498e 100644 --- a/crates/parser/test_data/parser/err/0034_bad_box_pattern.rast +++ b/crates/parser/test_data/parser/err/0034_bad_box_pattern.rast @@ -1,93 +1,71 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT - REF_KW "ref" - WHITESPACE " " + REF_KW "ref" [] [WHITESPACE(" ")] ERROR - BOX_KW "box" - WHITESPACE " " + BOX_KW "box" [] [WHITESPACE(" ")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "i" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "i" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] ERROR - BOX_KW "box" - WHITESPACE " " + BOX_KW "box" [] [WHITESPACE(" ")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "i" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "i" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT - REF_KW "ref" - WHITESPACE " " - MUT_KW "mut" - WHITESPACE " " + REF_KW "ref" [] [WHITESPACE(" ")] + MUT_KW "mut" [] [WHITESPACE(" ")] ERROR - BOX_KW "box" - WHITESPACE " " + BOX_KW "box" [] [WHITESPACE(" ")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "i" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "i" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" [NEWLINE("\n")] [] error 24: expected a name error 27: expected SEMICOLON error 48: expected a name diff --git a/crates/parser/test_data/parser/err/0035_use_recover.rast b/crates/parser/test_data/parser/err/0035_use_recover.rast index f9287d42e20e..5bfcf34a5a18 100644 --- a/crates/parser/test_data/parser/err/0035_use_recover.rast +++ b/crates/parser/test_data/parser/err/0035_use_recover.rast @@ -1,7 +1,6 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -12,14 +11,11 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "bar" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE "\n" + USE_KW "use" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -30,25 +26,21 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "baz" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE "\n" + USE_KW "use" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 17: expected one of `*`, `::`, `{`, `self`, `super` or an identifier error 17: expected SEMICOLON error 37: expected one of `*`, `::`, `{`, `self`, `super` or an identifier diff --git a/crates/parser/test_data/parser/err/0036_partial_use.rast b/crates/parser/test_data/parser/err/0036_partial_use.rast index e27c94179391..96b39a781f55 100644 --- a/crates/parser/test_data/parser/err/0036_partial_use.rast +++ b/crates/parser/test_data/parser/err/0036_partial_use.rast @@ -1,7 +1,6 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT @@ -20,11 +19,9 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Error" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -35,6 +32,6 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "io" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 22: expected R_CURLY diff --git a/crates/parser/test_data/parser/err/0039_lambda_recovery.rast b/crates/parser/test_data/parser/err/0039_lambda_recovery.rast index 8ca160601534..a8a2659f9e12 100644 --- a/crates/parser/test_data/parser/err/0039_lambda_recovery.rast +++ b/crates/parser/test_data/parser/err/0039_lambda_recovery.rast @@ -1,40 +1,33 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " + IDENT "i32" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT METHOD_CALL_EXPR METHOD_CALL_EXPR METHOD_CALL_EXPR ARRAY_EXPR - L_BRACK "[" + L_BRACK "[" [WHITESPACE(" ")] [] LITERAL INT_NUMBER "1" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LITERAL INT_NUMBER "3" R_BRACK "]" @@ -43,9 +36,8 @@ SOURCE_FILE IDENT "iter" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n " - DOT "." + R_PAREN ")" [] [NEWLINE("\n")] + DOT "." [WHITESPACE(" ")] [] NAME_REF IDENT "map" ARG_LIST @@ -58,9 +50,8 @@ SOURCE_FILE NAME IDENT "it" PIPE "|" - R_PAREN ")" - WHITESPACE "\n " - DOT "." + R_PAREN ")" [] [NEWLINE("\n")] + DOT "." [WHITESPACE(" ")] [] NAME_REF IDENT "max" GENERIC_ARG_LIST @@ -76,8 +67,7 @@ SOURCE_FILE ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 56: expected expression diff --git a/crates/parser/test_data/parser/err/0042_weird_blocks.rast b/crates/parser/test_data/parser/err/0042_weird_blocks.rast index 9e4e9dbf9d25..79983da990a8 100644 --- a/crates/parser/test_data/parser/err/0042_weird_blocks.rast +++ b/crates/parser/test_data/parser/err/0042_weird_blocks.rast @@ -1,75 +1,56 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [WHITESPACE(" ")] [WHITESPACE(" ")] ERROR - UNSAFE_KW "unsafe" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "92" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n " + INT_NUMBER "92" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [WHITESPACE(" ")] [WHITESPACE(" ")] ERROR - ASYNC_KW "async" - WHITESPACE " " + ASYNC_KW "async" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "92" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n " + INT_NUMBER "92" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [WHITESPACE(" ")] [WHITESPACE(" ")] EXPR_STMT BLOCK_EXPR TRY_BLOCK_MODIFIER - TRY_KW "try" - WHITESPACE " " + TRY_KW "try" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "92" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n " + INT_NUMBER "92" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [WHITESPACE(" ")] [WHITESPACE(" ")] ERROR LABEL LIFETIME LIFETIME_IDENT "'label" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "92" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + INT_NUMBER "92" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 24: expected fn, trait or impl error 41: expected fn, trait or impl error 56: expected a block diff --git a/crates/parser/test_data/parser/err/0043_unexpected_for_type.rast b/crates/parser/test_data/parser/err/0043_unexpected_for_type.rast index 9c4ee6f712ad..96c88ad9ca21 100644 --- a/crates/parser/test_data/parser/err/0043_unexpected_for_type.rast +++ b/crates/parser/test_data/parser/err/0043_unexpected_for_type.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "ForRef" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "ForRef" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FOR_TYPE FOR_BINDER FOR_KW "for" @@ -15,28 +12,22 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u32" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "ForTup" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "ForTup" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FOR_TYPE FOR_BINDER FOR_KW "for" @@ -45,15 +36,13 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -61,16 +50,12 @@ SOURCE_FILE IDENT "u32" COMMA "," R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "ForSlice" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "ForSlice" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FOR_TYPE FOR_BINDER FOR_KW "for" @@ -79,8 +64,7 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] SLICE_TYPE L_BRACK "[" PATH_TYPE @@ -89,16 +73,12 @@ SOURCE_FILE NAME_REF IDENT "u32" R_BRACK "]" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "ForForFn" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "ForForFn" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FOR_TYPE FOR_BINDER FOR_KW "for" @@ -107,8 +87,7 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] FOR_TYPE FOR_BINDER FOR_KW "for" @@ -117,8 +96,7 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'b" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] FN_PTR_TYPE FN_KW "fn" PARAM_LIST @@ -127,32 +105,27 @@ SOURCE_FILE REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'b" - WHITESPACE " " + LIFETIME_IDENT "'b" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "for_for_for" GENERIC_PARAM_LIST @@ -163,21 +136,18 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE "\n " + WHERE_KW "where" [] [NEWLINE("\n")] WHERE_PRED FOR_BINDER - FOR_KW "for" + FOR_KW "for" [WHITESPACE(" ")] [] GENERIC_PARAM_LIST L_ANGLE "<" LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] FOR_TYPE FOR_BINDER FOR_KW "for" @@ -186,8 +156,7 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'b" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] FOR_TYPE FOR_BINDER FOR_KW "for" @@ -196,8 +165,7 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'c" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] FN_PTR_TYPE FN_KW "fn" PARAM_LIST @@ -206,42 +174,36 @@ SOURCE_FILE REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "T" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'b" - WHITESPACE " " + LIFETIME_IDENT "'b" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "T" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'c" - WHITESPACE " " + LIFETIME_IDENT "'c" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "T" R_PAREN ")" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -249,14 +211,12 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Copy" - COMMA "," - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 21: expected a function pointer or path error 52: expected a function pointer or path error 88: expected a function pointer or path diff --git a/crates/parser/test_data/parser/err/0044_item_modifiers.rast b/crates/parser/test_data/parser/err/0044_item_modifiers.rast index 7a3ca66476e3..73194398b876 100644 --- a/crates/parser/test_data/parser/err/0044_item_modifiers.rast +++ b/crates/parser/test_data/parser/err/0044_item_modifiers.rast @@ -1,31 +1,23 @@ SOURCE_FILE ERROR - UNSAFE_KW "unsafe" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] FN - ASYNC_KW "async" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + ASYNC_KW "async" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] CONST - UNSAFE_KW "unsafe" - WHITESPACE " " - CONST_KW "const" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] + CONST_KW "const" [] [WHITESPACE(" ")] ERROR - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] ERROR PATH PATH_SEGMENT @@ -34,12 +26,11 @@ SOURCE_FILE ERROR L_PAREN "(" ERROR - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] ERROR L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 6: expected fn, trait or impl error 38: expected a name error 40: missing type for `const` diff --git a/crates/parser/test_data/parser/err/0047_repeated_extern_modifier.rast b/crates/parser/test_data/parser/err/0047_repeated_extern_modifier.rast index a56d692335fe..30fa1e573fac 100644 --- a/crates/parser/test_data/parser/err/0047_repeated_extern_modifier.rast +++ b/crates/parser/test_data/parser/err/0047_repeated_extern_modifier.rast @@ -1,15 +1,12 @@ SOURCE_FILE ERROR ABI - EXTERN_KW "extern" - WHITESPACE " " - STRING "\"C\"" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + STRING "\"C\"" [] [WHITESPACE(" ")] ERROR ABI - EXTERN_KW "extern" - WHITESPACE " " - STRING "\"C\"" - WHITESPACE "\n" + EXTERN_KW "extern" [] [WHITESPACE(" ")] + STRING "\"C\"" [] [NEWLINE("\n")] + EOF "" error 10: expected fn, trait or impl error 21: expected fn, trait or impl diff --git a/crates/parser/test_data/parser/err/0048_double_fish.rast b/crates/parser/test_data/parser/err/0048_double_fish.rast index 47daaf7b3b3e..2f4726bae194 100644 --- a/crates/parser/test_data/parser/err/0048_double_fish.rast +++ b/crates/parser/test_data/parser/err/0048_double_fish.rast @@ -1,23 +1,20 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" + IDENT "S" [WHITESPACE(" ")] [] GENERIC_ARG_LIST COLON2 "::" L_ANGLE "<" @@ -51,30 +48,23 @@ SOURCE_FILE R_ANGLE ">" R_ANGLE ">" ERROR - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "g" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH @@ -102,19 +92,16 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "nope" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] ERROR - EQ "=" - WHITESPACE " " + EQ "=" [] [WHITESPACE(" ")] EXPR_STMT TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 30: expected identifier, `self`, `super`, `crate`, or `Self` error 31: expected COMMA error 37: expected expression diff --git a/crates/parser/test_data/parser/err/0049_let_else_right_curly_brace_for.rast b/crates/parser/test_data/parser/err/0049_let_else_right_curly_brace_for.rast index 026fecf4c9d5..d9e4d49bdb5b 100644 --- a/crates/parser/test_data/parser/err/0049_let_else_right_curly_brace_for.rast +++ b/crates/parser/test_data/parser/err/0049_let_else_right_curly_brace_for.rast @@ -1,58 +1,43 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FOR_EXPR - FOR_KW "for" - WHITESPACE " " + FOR_KW "for" [] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - IN_KW "in" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + IN_KW "in" [] [WHITESPACE(" ")] RANGE_EXPR LITERAL INT_NUMBER "0" DOT2 ".." LITERAL - INT_NUMBER "10" - WHITESPACE " " + INT_NUMBER "10" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE " " + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RETURN_EXPR - RETURN_KW "return" - WHITESPACE "\n " - R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + RETURN_KW "return" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] R_CURLY "}" + EOF "" error 43: right curly brace `}` before `else` in a `let...else` statement not allowed diff --git a/crates/parser/test_data/parser/err/0050_let_else_right_curly_brace_loop.rast b/crates/parser/test_data/parser/err/0050_let_else_right_curly_brace_loop.rast index 102321954130..74aa0712433f 100644 --- a/crates/parser/test_data/parser/err/0050_let_else_right_curly_brace_loop.rast +++ b/crates/parser/test_data/parser/err/0050_let_else_right_curly_brace_loop.rast @@ -1,46 +1,34 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LOOP_EXPR - LOOP_KW "loop" - WHITESPACE " " + LOOP_KW "loop" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE " " + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RETURN_EXPR - RETURN_KW "return" - WHITESPACE "\n " - R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + RETURN_KW "return" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] R_CURLY "}" + EOF "" error 33: right curly brace `}` before `else` in a `let...else` statement not allowed diff --git a/crates/parser/test_data/parser/err/0051_let_else_right_curly_brace_match.rast b/crates/parser/test_data/parser/err/0051_let_else_right_curly_brace_match.rast index 6e1181246c06..351eea63af39 100644 --- a/crates/parser/test_data/parser/err/0051_let_else_right_curly_brace_match.rast +++ b/crates/parser/test_data/parser/err/0051_let_else_right_curly_brace_match.rast @@ -1,28 +1,21 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -33,53 +26,41 @@ SOURCE_FILE L_PAREN "(" LITERAL INT_NUMBER "1" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM TUPLE_STRUCT_PAT PATH PATH_SEGMENT NAME_REF - IDENT "Some" + IDENT "Some" [WHITESPACE(" ")] [] L_PAREN "(" WILDCARD_PAT UNDERSCORE "_" - R_PAREN ")" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM IDENT_PAT NAME - IDENT "None" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + IDENT "None" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE " " + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RETURN_EXPR - RETURN_KW "return" - WHITESPACE "\n " - R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + RETURN_KW "return" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] R_CURLY "}" + EOF "" error 83: right curly brace `}` before `else` in a `let...else` statement not allowed diff --git a/crates/parser/test_data/parser/err/0052_let_else_right_curly_brace_while.rast b/crates/parser/test_data/parser/err/0052_let_else_right_curly_brace_while.rast index 298d47d5394b..43fe2236c5db 100644 --- a/crates/parser/test_data/parser/err/0052_let_else_right_curly_brace_while.rast +++ b/crates/parser/test_data/parser/err/0052_let_else_right_curly_brace_while.rast @@ -1,49 +1,36 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] WHILE_EXPR - WHILE_KW "while" - WHITESPACE " " + WHILE_KW "while" [] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE " " + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RETURN_EXPR - RETURN_KW "return" - WHITESPACE "\n " - R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + RETURN_KW "return" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] R_CURLY "}" + EOF "" error 39: right curly brace `}` before `else` in a `let...else` statement not allowed diff --git a/crates/parser/test_data/parser/err/0053_let_else_right_curly_brace_if.rast b/crates/parser/test_data/parser/err/0053_let_else_right_curly_brace_if.rast index c0a4b0400d89..d9fc19eed3e8 100644 --- a/crates/parser/test_data/parser/err/0053_let_else_right_curly_brace_if.rast +++ b/crates/parser/test_data/parser/err/0053_let_else_right_curly_brace_if.rast @@ -1,57 +1,41 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE " " - ELSE_KW "else" - WHITESPACE " " + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [WHITESPACE(" ")] + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE " " + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RETURN_EXPR - RETURN_KW "return" - WHITESPACE "\n " - R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + RETURN_KW "return" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] R_CURLY "}" + EOF "" error 49: right curly brace `}` before `else` in a `let...else` statement not allowed diff --git a/crates/parser/test_data/parser/err/0054_float_split_scientific_notation.rast b/crates/parser/test_data/parser/err/0054_float_split_scientific_notation.rast index d6ad7334839d..b4b4b0b6303e 100644 --- a/crates/parser/test_data/parser/err/0054_float_split_scientific_notation.rast +++ b/crates/parser/test_data/parser/err/0054_float_split_scientific_notation.rast @@ -1,7 +1,6 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" TUPLE_FIELD_LIST @@ -12,8 +11,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "i32" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TUPLE_FIELD PATH_TYPE PATH @@ -21,30 +19,23 @@ SOURCE_FILE NAME_REF IDENT "i32" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "s" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "s" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -55,22 +46,17 @@ SOURCE_FILE L_PAREN "(" LITERAL INT_NUMBER "1" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FIELD_EXPR FIELD_EXPR PATH_EXPR @@ -81,8 +67,7 @@ SOURCE_FILE DOT "." ERROR FLOAT_NUMBER "1e0" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" -error 42: illegal float literal + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" +error 64: illegal float literal diff --git a/crates/parser/test_data/parser/err/0055_impl_use.rast b/crates/parser/test_data/parser/err/0055_impl_use.rast index 87a8b519d7ea..dade17a7879b 100644 --- a/crates/parser/test_data/parser/err/0055_impl_use.rast +++ b/crates/parser/test_data/parser/err/0055_impl_use.rast @@ -6,20 +6,18 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE "\n" + COLON ":" [] [NEWLINE("\n")] TYPE_BOUND_LIST ERROR - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] ERROR PATH PATH_SEGMENT NAME_REF IDENT "std" ERROR - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 8: expected R_ANGLE error 8: expected type error 11: expected `{` diff --git a/crates/parser/test_data/parser/err/0056_let_else_right_curly_brace_struct.rast b/crates/parser/test_data/parser/err/0056_let_else_right_curly_brace_struct.rast index 578dc2b0f966..27be4376fc57 100644 --- a/crates/parser/test_data/parser/err/0056_let_else_right_curly_brace_struct.rast +++ b/crates/parser/test_data/parser/err/0056_let_else_right_curly_brace_struct.rast @@ -1,79 +1,61 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME - IDENT "X" - WHITESPACE " " + IDENT "X" [] [WHITESPACE(" ")] RECORD_FIELD_LIST L_CURLY "{" RECORD_FIELD NAME IDENT "a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "X" - WHITESPACE " " + IDENT "X" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RECORD_EXPR_FIELD NAME_REF - IDENT "a" - COLON ":" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "1" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE " " + INT_NUMBER "1" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RETURN_EXPR - RETURN_KW "return" - SEMICOLON ";" - WHITESPACE "\n " - R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + RETURN_KW "return" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] R_CURLY "}" + EOF "" error 63: right curly brace `}` before `else` in a `let...else` statement not allowed diff --git a/crates/parser/test_data/parser/err/0057_let_else_right_curly_brace_arithmetic.rast b/crates/parser/test_data/parser/err/0057_let_else_right_curly_brace_arithmetic.rast index 8e994f22d41b..e74a8ac40b4d 100644 --- a/crates/parser/test_data/parser/err/0057_let_else_right_curly_brace_arithmetic.rast +++ b/crates/parser/test_data/parser/err/0057_let_else_right_curly_brace_arithmetic.rast @@ -1,42 +1,31 @@ SOURCE_FILE ERROR - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LITERAL - INT_NUMBER "1" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE " " + INT_NUMBER "1" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RETURN_EXPR - RETURN_KW "return" - SEMICOLON ";" - WHITESPACE "\n" + RETURN_KW "return" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 0: expected an item error 23: right curly brace `}` before `else` in a `let...else` statement not allowed diff --git a/crates/parser/test_data/parser/err/0057_let_else_right_curly_brace_format_args.rast b/crates/parser/test_data/parser/err/0057_let_else_right_curly_brace_format_args.rast index 055b583acec8..c76be702e327 100644 --- a/crates/parser/test_data/parser/err/0057_let_else_right_curly_brace_format_args.rast +++ b/crates/parser/test_data/parser/err/0057_let_else_right_curly_brace_format_args.rast @@ -1,26 +1,20 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "r" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "ok" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "ok" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] MACRO_EXPR MACRO_CALL PATH @@ -31,60 +25,46 @@ SOURCE_FILE TOKEN_TREE L_PAREN "(" STRING "\"\"" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT RETURN_EXPR RETURN_KW "return" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "bad" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "bad" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] MACRO_EXPR MACRO_CALL PATH PATH_SEGMENT NAME_REF IDENT "format_args" - BANG "!" - WHITESPACE " " + BANG "!" [] [WHITESPACE(" ")] TOKEN_TREE L_CURLY "{" STRING "\"\"" - R_CURLY "}" - WHITESPACE " " + R_CURLY "}" [] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT RETURN_EXPR RETURN_KW "return" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 89: right curly brace `}` before `else` in a `let...else` statement not allowed diff --git a/crates/parser/test_data/parser/err/0058_let_else_right_curly_brace_range.rast b/crates/parser/test_data/parser/err/0058_let_else_right_curly_brace_range.rast index 8c7fd8c295d9..d0b5bfc0c8ef 100644 --- a/crates/parser/test_data/parser/err/0058_let_else_right_curly_brace_range.rast +++ b/crates/parser/test_data/parser/err/0058_let_else_right_curly_brace_range.rast @@ -1,40 +1,31 @@ SOURCE_FILE ERROR - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] RANGE_EXPR LITERAL INT_NUMBER "1" DOT2 ".." BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LITERAL - INT_NUMBER "1" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE " " + INT_NUMBER "1" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RETURN_EXPR - RETURN_KW "return" - SEMICOLON ";" - WHITESPACE "\n" + RETURN_KW "return" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 0: expected an item error 22: right curly brace `}` before `else` in a `let...else` statement not allowed diff --git a/crates/parser/test_data/parser/err/0059_let_else_right_curly_brace_closure.rast b/crates/parser/test_data/parser/err/0059_let_else_right_curly_brace_closure.rast index 57925a0d192f..d4af337abae3 100644 --- a/crates/parser/test_data/parser/err/0059_let_else_right_curly_brace_closure.rast +++ b/crates/parser/test_data/parser/err/0059_let_else_right_curly_brace_closure.rast @@ -1,13 +1,10 @@ SOURCE_FILE ERROR - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CLOSURE_EXPR PARAM_LIST PIPE "|" @@ -15,41 +12,33 @@ SOURCE_FILE IDENT_PAT NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "x" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE " " + IDENT "x" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RETURN_EXPR - RETURN_KW "return" - SEMICOLON ";" - WHITESPACE "\n" + RETURN_KW "return" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 0: expected an item error 28: right curly brace `}` before `else` in a `let...else` statement not allowed diff --git a/crates/parser/test_data/parser/err/0060_let_else_right_curly_brace_unary.rast b/crates/parser/test_data/parser/err/0060_let_else_right_curly_brace_unary.rast index 4fb70bd50e38..fcc33543bde5 100644 --- a/crates/parser/test_data/parser/err/0060_let_else_right_curly_brace_unary.rast +++ b/crates/parser/test_data/parser/err/0060_let_else_right_curly_brace_unary.rast @@ -1,38 +1,29 @@ SOURCE_FILE ERROR - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PREFIX_EXPR MINUS "-" BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LITERAL - INT_NUMBER "1" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE " " + INT_NUMBER "1" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RETURN_EXPR - RETURN_KW "return" - SEMICOLON ";" - WHITESPACE "\n" + RETURN_KW "return" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 0: expected an item error 20: right curly brace `}` before `else` in a `let...else` statement not allowed diff --git a/crates/parser/test_data/parser/err/0061_let_else_right_curly_brace_do_yeet.rast b/crates/parser/test_data/parser/err/0061_let_else_right_curly_brace_do_yeet.rast index e8eeeee695e9..0c35b61b930d 100644 --- a/crates/parser/test_data/parser/err/0061_let_else_right_curly_brace_do_yeet.rast +++ b/crates/parser/test_data/parser/err/0061_let_else_right_curly_brace_do_yeet.rast @@ -1,16 +1,13 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "o" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -22,53 +19,39 @@ SOURCE_FILE TUPLE_TYPE L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_ARG TUPLE_TYPE L_PAREN "(" R_PAREN ")" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] YEET_EXPR - DO_KW "do" - WHITESPACE " " - YEET_KW "yeet" - WHITESPACE " " + DO_KW "do" [] [WHITESPACE(" ")] + YEET_KW "yeet" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] TUPLE_EXPR - L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE " " + L_PAREN "(" [WHITESPACE(" ")] [] + R_PAREN ")" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RETURN_EXPR - RETURN_KW "return" - WHITESPACE " " + RETURN_KW "return" [WHITESPACE(" ")] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -81,10 +64,9 @@ SOURCE_FILE L_PAREN "(" R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " - R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] R_CURLY "}" + EOF "" error 67: right curly brace `}` before `else` in a `let...else` statement not allowed diff --git a/crates/parser/test_data/parser/err/0062_let_else_right_curly_brace_become.rast b/crates/parser/test_data/parser/err/0062_let_else_right_curly_brace_become.rast index cc5e1278c3de..83f7eae9389b 100644 --- a/crates/parser/test_data/parser/err/0062_let_else_right_curly_brace_become.rast +++ b/crates/parser/test_data/parser/err/0062_let_else_right_curly_brace_become.rast @@ -1,40 +1,30 @@ SOURCE_FILE ERROR - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BECOME_EXPR - BECOME_KW "become" - WHITESPACE " " + BECOME_KW "become" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] TUPLE_EXPR - L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE " " + L_PAREN "(" [WHITESPACE(" ")] [] + R_PAREN ")" [] [NEWLINE("\n")] + R_CURLY "}" [] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RETURN_EXPR - RETURN_KW "return" - SEMICOLON ";" - WHITESPACE "\n" + RETURN_KW "return" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 0: expected an item error 27: right curly brace `}` before `else` in a `let...else` statement not allowed diff --git a/crates/parser/test_data/parser/err/0063_let_else_right_curly_brace_reference.rast b/crates/parser/test_data/parser/err/0063_let_else_right_curly_brace_reference.rast index ea2f4f28e2d8..3c9453763d00 100644 --- a/crates/parser/test_data/parser/err/0063_let_else_right_curly_brace_reference.rast +++ b/crates/parser/test_data/parser/err/0063_let_else_right_curly_brace_reference.rast @@ -1,38 +1,29 @@ SOURCE_FILE ERROR - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_EXPR AMP "&" BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LITERAL - INT_NUMBER "1" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE " " + INT_NUMBER "1" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RETURN_EXPR - RETURN_KW "return" - SEMICOLON ";" - WHITESPACE "\n" + RETURN_KW "return" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 0: expected an item error 20: right curly brace `}` before `else` in a `let...else` statement not allowed diff --git a/crates/parser/test_data/parser/err/0064_let_else_right_curly_brace_assignment.rast b/crates/parser/test_data/parser/err/0064_let_else_right_curly_brace_assignment.rast index 47396140c5c3..3337233c6101 100644 --- a/crates/parser/test_data/parser/err/0064_let_else_right_curly_brace_assignment.rast +++ b/crates/parser/test_data/parser/err/0064_let_else_right_curly_brace_assignment.rast @@ -1,45 +1,34 @@ SOURCE_FILE ERROR - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "bar" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "bar" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LITERAL - INT_NUMBER "1" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE " " + INT_NUMBER "1" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RETURN_EXPR - RETURN_KW "return" - SEMICOLON ";" - WHITESPACE "\n" + RETURN_KW "return" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 0: expected an item error 25: right curly brace `}` before `else` in a `let...else` statement not allowed diff --git a/crates/parser/test_data/parser/inline/err/angled_path_without_qual.rast b/crates/parser/test_data/parser/inline/err/angled_path_without_qual.rast index 53fbe0b615e0..8ae529cdb127 100644 --- a/crates/parser/test_data/parser/inline/err/angled_path_without_qual.rast +++ b/crates/parser/test_data/parser/inline/err/angled_path_without_qual.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "X" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "X" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -16,16 +13,12 @@ SOURCE_FILE L_PAREN "(" R_PAREN ")" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "Y" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Y" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -35,17 +28,15 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "A" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + IDENT "A" [] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "B" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 13: expected `::` error 32: expected `::` diff --git a/crates/parser/test_data/parser/inline/err/anonymous_static.rast b/crates/parser/test_data/parser/inline/err/anonymous_static.rast index 823db94f58a3..fb9578694d91 100644 --- a/crates/parser/test_data/parser/inline/err/anonymous_static.rast +++ b/crates/parser/test_data/parser/inline/err/anonymous_static.rast @@ -1,21 +1,17 @@ SOURCE_FILE STATIC - STATIC_KW "static" - WHITESPACE " " + STATIC_KW "static" [] [WHITESPACE(" ")] ERROR UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "i32" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "5" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 7: expected a name diff --git a/crates/parser/test_data/parser/inline/err/arg_list_recovery.rast b/crates/parser/test_data/parser/inline/err/arg_list_recovery.rast index 755b20bb271f..4b2e5a496fef 100644 --- a/crates/parser/test_data/parser/inline/err/arg_list_recovery.rast +++ b/crates/parser/test_data/parser/inline/err/arg_list_recovery.rast @@ -1,24 +1,21 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "foo" + IDENT "foo" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" PATH_EXPR @@ -29,15 +26,14 @@ SOURCE_FILE IDENT "bar" COLON2 "::" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "foo" + IDENT "foo" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" PATH_EXPR @@ -48,15 +44,14 @@ SOURCE_FILE ERROR COLON ":" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "foo" + IDENT "foo" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" BIN_EXPR @@ -67,15 +62,14 @@ SOURCE_FILE IDENT "bar" PLUS "+" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "foo" + IDENT "foo" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" PATH_EXPR @@ -83,21 +77,18 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ERROR - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "b" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 25: expected identifier, `self`, `super`, `crate`, or `Self` error 39: expected COMMA error 39: expected expression diff --git a/crates/parser/test_data/parser/inline/err/array_type_missing_semi.rast b/crates/parser/test_data/parser/inline/err/array_type_missing_semi.rast index ed739a7e3983..38a675c83541 100644 --- a/crates/parser/test_data/parser/inline/err/array_type_missing_semi.rast +++ b/crates/parser/test_data/parser/inline/err/array_type_missing_semi.rast @@ -1,25 +1,21 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] SLICE_TYPE L_BRACK "[" TUPLE_TYPE L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] ERROR INT_NUMBER "92" ERROR R_BRACK "]" ERROR - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 12: expected `;` or `]` error 12: expected SEMICOLON error 13: expected an item diff --git a/crates/parser/test_data/parser/inline/err/async_without_semicolon.rast b/crates/parser/test_data/parser/inline/err/async_without_semicolon.rast index bf20d5fa4f69..08719f8916db 100644 --- a/crates/parser/test_data/parser/inline/err/async_without_semicolon.rast +++ b/crates/parser/test_data/parser/inline/err/async_without_semicolon.rast @@ -1,32 +1,24 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BLOCK_EXPR - ASYNC_KW "async" - WHITESPACE " " + ASYNC_KW "async" [] [WHITESPACE(" ")] STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 27: expected SEMICOLON diff --git a/crates/parser/test_data/parser/inline/err/bad_asm_expr.rast b/crates/parser/test_data/parser/inline/err/bad_asm_expr.rast index 306446e64dd4..a70f04a9ea91 100644 --- a/crates/parser/test_data/parser/inline/err/bad_asm_expr.rast +++ b/crates/parser/test_data/parser/inline/err/bad_asm_expr.rast @@ -1,50 +1,39 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT ASM_EXPR - BUILTIN_KW "builtin" + BUILTIN_KW "builtin" [WHITESPACE(" ")] [] POUND "#" ASM_KW "asm" - L_PAREN "(" - WHITESPACE "\n " + L_PAREN "(" [] [NEWLINE("\n")] PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "label" - WHITESPACE " " + IDENT "label" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME - IDENT "crashy" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "crashy" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT RETURN_EXPR RETURN_KW "return" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n " - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + R_PAREN ")" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 41: expected COMMA error 50: expected asm operand diff --git a/crates/parser/test_data/parser/inline/err/closure_ret_recovery.rast b/crates/parser/test_data/parser/inline/err/closure_ret_recovery.rast index f6266510bb4f..9428cb050d4e 100644 --- a/crates/parser/test_data/parser/inline/err/closure_ret_recovery.rast +++ b/crates/parser/test_data/parser/inline/err/closure_ret_recovery.rast @@ -1,52 +1,40 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] CLOSURE_EXPR PARAM_LIST PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "A" ERROR - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "x" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 18: expected a curly brace diff --git a/crates/parser/test_data/parser/inline/err/comma_after_default_values_syntax.rast b/crates/parser/test_data/parser/inline/err/comma_after_default_values_syntax.rast index b57066f2fb38..9529c1b09175 100644 --- a/crates/parser/test_data/parser/inline/err/comma_after_default_values_syntax.rast +++ b/crates/parser/test_data/parser/inline/err/comma_after_default_values_syntax.rast @@ -1,57 +1,44 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] DOT2 ".." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] DOT2 ".." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] RECORD_EXPR_FIELD NAME_REF IDENT "a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "0" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + INT_NUMBER "0" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 21: expected expression error 21: cannot use a comma after the base struct error 36: expected expression diff --git a/crates/parser/test_data/parser/inline/err/comma_after_functional_update_syntax.rast b/crates/parser/test_data/parser/inline/err/comma_after_functional_update_syntax.rast index 0e2fe5988d6a..0c0993739b2e 100644 --- a/crates/parser/test_data/parser/inline/err/comma_after_functional_update_syntax.rast +++ b/crates/parser/test_data/parser/inline/err/comma_after_functional_update_syntax.rast @@ -1,66 +1,53 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] DOT2 ".." PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "x" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] DOT2 ".." PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "x" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] RECORD_EXPR_FIELD NAME_REF IDENT "a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "0" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + INT_NUMBER "0" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 22: cannot use a comma after the base struct error 38: cannot use a comma after the base struct diff --git a/crates/parser/test_data/parser/inline/err/crate_visibility_empty_recover.rast b/crates/parser/test_data/parser/inline/err/crate_visibility_empty_recover.rast index 37116ca895be..ea904f41aebc 100644 --- a/crates/parser/test_data/parser/inline/err/crate_visibility_empty_recover.rast +++ b/crates/parser/test_data/parser/inline/err/crate_visibility_empty_recover.rast @@ -4,12 +4,10 @@ SOURCE_FILE PUB_KW "pub" VISIBILITY_INNER L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - STRUCT_KW "struct" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 4: expected identifier, `self`, `super`, `crate`, or `Self` diff --git a/crates/parser/test_data/parser/inline/err/empty_param_slot.rast b/crates/parser/test_data/parser/inline/err/empty_param_slot.rast index 39e35a81ee27..d1403c247a32 100644 --- a/crates/parser/test_data/parser/inline/err/empty_param_slot.rast +++ b/crates/parser/test_data/parser/inline/err/empty_param_slot.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST @@ -10,32 +9,28 @@ SOURCE_FILE IDENT_PAT NAME IDENT "y" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] COMMA "," PARAM IDENT_PAT NAME IDENT "t" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 12: expected value parameter diff --git a/crates/parser/test_data/parser/inline/err/empty_segment.rast b/crates/parser/test_data/parser/inline/err/empty_segment.rast index 7f256218eff3..12aa005dc466 100644 --- a/crates/parser/test_data/parser/inline/err/empty_segment.rast +++ b/crates/parser/test_data/parser/inline/err/empty_segment.rast @@ -1,7 +1,6 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -9,6 +8,6 @@ SOURCE_FILE NAME_REF CRATE_KW "crate" COLON2 "::" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 11: expected identifier, `self`, `super`, `crate`, or `Self` diff --git a/crates/parser/test_data/parser/inline/err/fn_pointer_type_missing_fn.rast b/crates/parser/test_data/parser/inline/err/fn_pointer_type_missing_fn.rast index eb059529396d..90702c8f0bfb 100644 --- a/crates/parser/test_data/parser/inline/err/fn_pointer_type_missing_fn.rast +++ b/crates/parser/test_data/parser/inline/err/fn_pointer_type_missing_fn.rast @@ -1,21 +1,17 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "F" - WHITESPACE " " - EQ "=" - WHITESPACE " " - UNSAFE_KW "unsafe" - WHITESPACE " " + IDENT "F" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] ERROR L_PAREN "(" ERROR R_PAREN ")" ERROR - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 15: expected `fn` error 15: expected SEMICOLON error 16: expected an item diff --git a/crates/parser/test_data/parser/inline/err/fn_ret_recovery.rast b/crates/parser/test_data/parser/inline/err/fn_ret_recovery.rast index 0323df8bf0ff..24704c102516 100644 --- a/crates/parser/test_data/parser/inline/err/fn_ret_recovery.rast +++ b/crates/parser/test_data/parser/inline/err/fn_ret_recovery.rast @@ -1,16 +1,13 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -21,39 +18,29 @@ SOURCE_FILE ERROR R_BRACK "]" ERROR - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "x" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -64,46 +51,37 @@ SOURCE_FILE ERROR R_BRACK "]" ERROR - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE " " + WHERE_KW "where" [] [WHITESPACE(" ")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Copy" - WHITESPACE " " + IDENT "Copy" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "x" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 13: expected a curly brace error 14: expected a curly brace error 15: expected a curly brace diff --git a/crates/parser/test_data/parser/inline/err/function_ret_type_missing_arrow.rast b/crates/parser/test_data/parser/inline/err/function_ret_type_missing_arrow.rast index c0bca6ed1c31..a5df3a523439 100644 --- a/crates/parser/test_data/parser/inline/err/function_ret_type_missing_arrow.rast +++ b/crates/parser/test_data/parser/inline/err/function_ret_type_missing_arrow.rast @@ -1,34 +1,28 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "usize" - WHITESPACE " " + IDENT "usize" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "bar" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE PATH_TYPE PATH @@ -39,12 +33,11 @@ SOURCE_FILE COLON2 "::" PATH_SEGMENT NAME_REF - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 9: missing thin-arrow `->` error 27: missing thin-arrow `->` diff --git a/crates/parser/test_data/parser/inline/err/gen_fn.rast b/crates/parser/test_data/parser/inline/err/gen_fn.rast index b6fd5a5d99bd..1750694378c1 100644 --- a/crates/parser/test_data/parser/inline/err/gen_fn.rast +++ b/crates/parser/test_data/parser/inline/err/gen_fn.rast @@ -1,49 +1,39 @@ SOURCE_FILE - COMMENT "// 2021" - WHITESPACE "\n" ERROR PATH PATH_SEGMENT NAME_REF - IDENT "gen" - WHITESPACE " " + IDENT "gen" [COMMENT("// 2021"), NEWLINE("\n")] [WHITESPACE(" ")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "gen_fn" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] ERROR - ASYNC_KW "async" - WHITESPACE " " + ASYNC_KW "async" [] [WHITESPACE(" ")] ERROR PATH PATH_SEGMENT NAME_REF - IDENT "gen" - WHITESPACE " " + IDENT "gen" [] [WHITESPACE(" ")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "async_gen_fn" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 11: expected an item error 32: expected fn, trait or impl error 36: expected an item diff --git a/crates/parser/test_data/parser/inline/err/generic_arg_list_recover.rast b/crates/parser/test_data/parser/inline/err/generic_arg_list_recover.rast index 16183ce9ef59..68608187243c 100644 --- a/crates/parser/test_data/parser/inline/err/generic_arg_list_recover.rast +++ b/crates/parser/test_data/parser/inline/err/generic_arg_list_recover.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -17,8 +14,7 @@ SOURCE_FILE CONST_ARG LITERAL INT_NUMBER "0" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ERROR COMMA "," TYPE_ARG @@ -28,16 +24,12 @@ SOURCE_FILE NAME_REF IDENT "T" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -49,8 +41,7 @@ SOURCE_FILE CONST_ARG LITERAL INT_NUMBER "0" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ERROR COMMA "," TYPE_ARG @@ -60,7 +51,7 @@ SOURCE_FILE NAME_REF IDENT "T" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 14: expected generic argument error 35: expected generic argument diff --git a/crates/parser/test_data/parser/inline/err/generic_arg_list_recover_expr.rast b/crates/parser/test_data/parser/inline/err/generic_arg_list_recover_expr.rast index de403d30494c..31fedc454d2f 100644 --- a/crates/parser/test_data/parser/inline/err/generic_arg_list_recover_expr.rast +++ b/crates/parser/test_data/parser/inline/err/generic_arg_list_recover_expr.rast @@ -1,16 +1,12 @@ SOURCE_FILE CONST - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT @@ -22,8 +18,7 @@ SOURCE_FILE CONST_ARG LITERAL INT_NUMBER "0" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ERROR COMMA "," TYPE_ARG @@ -33,20 +28,15 @@ SOURCE_FILE NAME_REF IDENT "T" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] CONST - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -59,8 +49,7 @@ SOURCE_FILE CONST_ARG LITERAL INT_NUMBER "0" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ERROR COMMA "," TYPE_ARG @@ -73,7 +62,7 @@ SOURCE_FILE ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 21: expected generic argument error 47: expected generic argument diff --git a/crates/parser/test_data/parser/inline/err/generic_param_list_recover.rast b/crates/parser/test_data/parser/inline/err/generic_param_list_recover.rast index 0a1ed01fbe63..80d58ead1a66 100644 --- a/crates/parser/test_data/parser/inline/err/generic_param_list_recover.rast +++ b/crates/parser/test_data/parser/inline/err/generic_param_list_recover.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" GENERIC_PARAM_LIST @@ -9,8 +8,7 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -20,26 +18,23 @@ SOURCE_FILE IDENT "Clone" COMMA "," ERROR - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_PARAM NAME IDENT "U" COLON ":" TYPE_BOUND_LIST - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_PARAM NAME IDENT "V" R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 14: expected generic parameter diff --git a/crates/parser/test_data/parser/inline/err/generic_static.rast b/crates/parser/test_data/parser/inline/err/generic_static.rast index 08017cb0fcd9..bcdd1804bcb2 100644 --- a/crates/parser/test_data/parser/inline/err/generic_static.rast +++ b/crates/parser/test_data/parser/inline/err/generic_static.rast @@ -1,7 +1,6 @@ SOURCE_FILE STATIC - STATIC_KW "static" - WHITESPACE " " + STATIC_KW "static" [] [WHITESPACE(" ")] NAME IDENT "C" GENERIC_PARAM_LIST @@ -10,18 +9,15 @@ SOURCE_FILE NAME IDENT "i32" R_ANGLE ">" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u32" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "u32" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 8: `static` may not have generic parameters diff --git a/crates/parser/test_data/parser/inline/err/impl_type.rast b/crates/parser/test_data/parser/inline/err/impl_type.rast index dbeb878a2e88..64673c32771b 100644 --- a/crates/parser/test_data/parser/inline/err/impl_type.rast +++ b/crates/parser/test_data/parser/inline/err/impl_type.rast @@ -1,78 +1,61 @@ SOURCE_FILE IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Type" - WHITESPACE " " + IDENT "Type" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Trait1" - WHITESPACE " " - FOR_KW "for" - WHITESPACE " " + IDENT "Trait1" [] [WHITESPACE(" ")] + FOR_KW "for" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "T" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "NotType" - WHITESPACE " " + IDENT "NotType" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Trait2" - WHITESPACE " " - FOR_KW "for" - WHITESPACE " " + IDENT "Trait2" [] [WHITESPACE(" ")] + FOR_KW "for" [] [WHITESPACE(" ")] IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "NotType" - WHITESPACE " " + IDENT "NotType" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 38: expected trait or type error 38: expected `{` error 70: expected trait or type diff --git a/crates/parser/test_data/parser/inline/err/invalid_question_for_type_trait_bound.rast b/crates/parser/test_data/parser/inline/err/invalid_question_for_type_trait_bound.rast index b060ee81d617..a5c6317818c7 100644 --- a/crates/parser/test_data/parser/inline/err/invalid_question_for_type_trait_bound.rast +++ b/crates/parser/test_data/parser/inline/err/invalid_question_for_type_trait_bound.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" GENERIC_PARAM_LIST @@ -12,19 +11,16 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE " " + WHERE_KW "where" [] [WHITESPACE(" ")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST QUESTION "?" WHERE_PRED @@ -32,18 +28,16 @@ SOURCE_FILE FOR_KW "for" GENERIC_PARAM_LIST L_ANGLE "<" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Sized" - WHITESPACE " " + IDENT "Sized" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 20: expected comma error 31: expected colon diff --git a/crates/parser/test_data/parser/inline/err/key_ident_cfg_predicate.rast b/crates/parser/test_data/parser/inline/err/key_ident_cfg_predicate.rast index de5fc7d5bdc0..7e412ae3235d 100644 --- a/crates/parser/test_data/parser/inline/err/key_ident_cfg_predicate.rast +++ b/crates/parser/test_data/parser/inline/err/key_ident_cfg_predicate.rast @@ -7,13 +7,11 @@ SOURCE_FILE CFG_KW "cfg" L_PAREN "(" CFG_ATOM - IDENT "key" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "key" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] ERROR IDENT "value" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] + EOF "" error 13: expected a string literal diff --git a/crates/parser/test_data/parser/inline/err/let_else_right_curly_brace.rast b/crates/parser/test_data/parser/inline/err/let_else_right_curly_brace.rast index 6ec580212b4f..73f4cbb429be 100644 --- a/crates/parser/test_data/parser/inline/err/let_else_right_curly_brace.rast +++ b/crates/parser/test_data/parser/inline/err/let_else_right_curly_brace.rast @@ -1,20 +1,16 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "func" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] TUPLE_STRUCT_PAT PATH PATH_SEGMENT @@ -23,10 +19,8 @@ SOURCE_FILE L_PAREN "(" WILDCARD_PAT UNDERSCORE "_" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" @@ -41,15 +35,12 @@ SOURCE_FILE LITERAL INT_NUMBER "1" R_PAREN ")" - R_CURLY "}" - WHITESPACE " " + R_CURLY "}" [] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] MACRO_EXPR MACRO_CALL PATH @@ -60,10 +51,9 @@ SOURCE_FILE TOKEN_TREE L_PAREN "(" STRING "\"h\"" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] R_CURLY "}" SEMICOLON ";" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 35: right curly brace `}` before `else` in a `let...else` statement not allowed diff --git a/crates/parser/test_data/parser/inline/err/macro_as_type_bound.rast b/crates/parser/test_data/parser/inline/err/macro_as_type_bound.rast index df223efbe9f7..54e558739a74 100644 --- a/crates/parser/test_data/parser/inline/err/macro_as_type_bound.rast +++ b/crates/parser/test_data/parser/inline/err/macro_as_type_bound.rast @@ -1,25 +1,20 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] MACRO_TYPE MACRO_CALL PATH @@ -29,11 +24,9 @@ SOURCE_FILE BANG "!" TOKEN_TREE L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] ERROR - PLUS "+" - WHITESPACE " " + PLUS "+" [] [WHITESPACE(" ")] EXPR_STMT BIN_EXPR MACRO_EXPR @@ -45,10 +38,8 @@ SOURCE_FILE BANG "!" TOKEN_TREE L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] MACRO_EXPR MACRO_CALL PATH @@ -59,9 +50,8 @@ SOURCE_FILE TOKEN_TREE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 25: expected SEMICOLON error 26: expected expression, item or let statement diff --git a/crates/parser/test_data/parser/inline/err/macro_rules_as_macro_name.rast b/crates/parser/test_data/parser/inline/err/macro_rules_as_macro_name.rast index 79d428a41c87..4508ca119847 100644 --- a/crates/parser/test_data/parser/inline/err/macro_rules_as_macro_name.rast +++ b/crates/parser/test_data/parser/inline/err/macro_rules_as_macro_name.rast @@ -4,36 +4,31 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "macro_rules" - BANG "!" - WHITESPACE " " + BANG "!" [] [WHITESPACE(" ")] TOKEN_TREE L_CURLY "{" R_CURLY "}" ERROR - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] MACRO_CALL PATH PATH_SEGMENT NAME_REF IDENT "macro_rules" - BANG "!" - WHITESPACE " " + BANG "!" [] [WHITESPACE(" ")] TOKEN_TREE L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] MACRO_CALL PATH PATH_SEGMENT NAME_REF IDENT "macro_rules" - BANG "!" - WHITESPACE " " + BANG "!" [] [WHITESPACE(" ")] TOKEN_TREE L_BRACK "[" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] + EOF "" error 15: expected an item error 32: expected SEMICOLON error 48: expected SEMICOLON diff --git a/crates/parser/test_data/parser/inline/err/match_arms_recovery.rast b/crates/parser/test_data/parser/inline/err/match_arms_recovery.rast index 5b191945e457..3603cbe366bb 100644 --- a/crates/parser/test_data/parser/inline/err/match_arms_recovery.rast +++ b/crates/parser/test_data/parser/inline/err/match_arms_recovery.rast @@ -1,111 +1,82 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" COMMA "," ERROR - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " - COMMA "," - WHITESPACE "\n " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] + COMMA "," [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM - FAT_ARROW "=>" - WHITESPACE " " + FAT_ARROW "=>" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM MATCH_GUARD - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM TUPLE_PAT - L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + L_PAREN "(" [WHITESPACE(" ")] [] + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_GUARD - IF_KW "if" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + IF_KW "if" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 42: expected pattern error 58: expected expression error 85: expected pattern diff --git a/crates/parser/test_data/parser/inline/err/meta_recovery.rast b/crates/parser/test_data/parser/inline/err/meta_recovery.rast index 9e456c98554d..7027e490d260 100644 --- a/crates/parser/test_data/parser/inline/err/meta_recovery.rast +++ b/crates/parser/test_data/parser/inline/err/meta_recovery.rast @@ -4,8 +4,7 @@ SOURCE_FILE BANG "!" L_BRACK "[" PATH_META - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -14,12 +13,9 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "p" - WHITESPACE " " - EQ "=" - WHITESPACE " " - R_BRACK "]" - WHITESPACE "\n" + IDENT "p" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -31,8 +27,7 @@ SOURCE_FILE NAME_REF IDENT "p" COLON2 "::" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -43,11 +38,9 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "p" - COLON2 "::" - WHITESPACE " " + COLON2 "::" [] [WHITESPACE(" ")] EQ "=" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -55,19 +48,17 @@ SOURCE_FILE UNSAFE_META UNSAFE_KW "unsafe" PATH_META - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" L_BRACK "[" UNSAFE_META - UNSAFE_KW "unsafe" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] KEY_VALUE_META EQ "=" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] + EOF "" error 3: expected identifier, `self`, `super`, `crate`, or `Self` error 11: expected expression error 11: expected expression diff --git a/crates/parser/test_data/parser/inline/err/method_call_missing_argument_list.rast b/crates/parser/test_data/parser/inline/err/method_call_missing_argument_list.rast index 02544b5e5326..38b4b131a15e 100644 --- a/crates/parser/test_data/parser/inline/err/method_call_missing_argument_list.rast +++ b/crates/parser/test_data/parser/inline/err/method_call_missing_argument_list.rast @@ -1,39 +1,35 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "func" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT METHOD_CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "foo" + IDENT "foo" [WHITESPACE(" ")] [] DOT "." NAME_REF IDENT "bar" GENERIC_ARG_LIST COLON2 "::" L_ANGLE "<" - R_ANGLE ">" - WHITESPACE "\n " + R_ANGLE ">" [] [NEWLINE("\n")] EXPR_STMT METHOD_CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "foo" + IDENT "foo" [WHITESPACE(" ")] [] DOT "." NAME_REF IDENT "bar" @@ -47,10 +43,9 @@ SOURCE_FILE NAME_REF IDENT "i32" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 27: expected argument list error 27: expected SEMICOLON error 46: expected argument list diff --git a/crates/parser/test_data/parser/inline/err/misplaced_label_err.rast b/crates/parser/test_data/parser/inline/err/misplaced_label_err.rast index ea5203fb96e0..c36be0f15b52 100644 --- a/crates/parser/test_data/parser/inline/err/misplaced_label_err.rast +++ b/crates/parser/test_data/parser/inline/err/misplaced_label_err.rast @@ -1,28 +1,23 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] ERROR LABEL LIFETIME - LIFETIME_IDENT "'loop" - COLON ":" - WHITESPACE " " + LIFETIME_IDENT "'loop" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] IMPL - IMPL_KW "impl" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + IMPL_KW "impl" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 22: expected a loop or block error 27: expected type error 27: expected `{` diff --git a/crates/parser/test_data/parser/inline/err/missing_const_type.rast b/crates/parser/test_data/parser/inline/err/missing_const_type.rast index 11097232a683..57c269f2c40f 100644 --- a/crates/parser/test_data/parser/inline/err/missing_const_type.rast +++ b/crates/parser/test_data/parser/inline/err/missing_const_type.rast @@ -1,14 +1,11 @@ SOURCE_FILE CONST - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] NAME - IDENT "C" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "C" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 7: missing type for `const` diff --git a/crates/parser/test_data/parser/inline/err/missing_fn_param_type.rast b/crates/parser/test_data/parser/inline/err/missing_fn_param_type.rast index ea50ad35d74d..cd11f33a21ff 100644 --- a/crates/parser/test_data/parser/inline/err/missing_fn_param_type.rast +++ b/crates/parser/test_data/parser/inline/err/missing_fn_param_type.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST @@ -9,45 +8,39 @@ SOURCE_FILE PARAM IDENT_PAT NAME - IDENT "x" - WHITESPACE " " + IDENT "x" [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "y" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "z" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "t" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 6: missing type for function parameter error 6: expected `,` error 16: missing type for function parameter diff --git a/crates/parser/test_data/parser/inline/err/missing_static_type.rast b/crates/parser/test_data/parser/inline/err/missing_static_type.rast index a9595401d6d6..2980cf03bd7b 100644 --- a/crates/parser/test_data/parser/inline/err/missing_static_type.rast +++ b/crates/parser/test_data/parser/inline/err/missing_static_type.rast @@ -1,14 +1,11 @@ SOURCE_FILE STATIC - STATIC_KW "static" - WHITESPACE " " + STATIC_KW "static" [] [WHITESPACE(" ")] NAME - IDENT "C" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "C" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 8: missing type for `static` diff --git a/crates/parser/test_data/parser/inline/err/non_isolated_self_err.rast b/crates/parser/test_data/parser/inline/err/non_isolated_self_err.rast index e75e641fedcc..e7d141ae11ac 100644 --- a/crates/parser/test_data/parser/inline/err/non_isolated_self_err.rast +++ b/crates/parser/test_data/parser/inline/err/non_isolated_self_err.rast @@ -1,15 +1,13 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" PARAM IDENT_PAT - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] ERROR SELF_KW "self" COLON ":" @@ -19,23 +17,19 @@ SOURCE_FILE IDENT_PAT NAME IDENT "S" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "S" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "g" PARAM_LIST @@ -44,8 +38,7 @@ SOURCE_FILE REF_PAT AMP "&" ERROR - LIFETIME_IDENT "'l" - WHITESPACE " " + LIFETIME_IDENT "'l" [] [WHITESPACE(" ")] PARAM PATH_PAT PATH @@ -57,8 +50,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "S" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] REF_TYPE AMP "&" PATH_TYPE @@ -66,16 +58,13 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "S" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "h" PARAM_LIST @@ -84,12 +73,10 @@ SOURCE_FILE REF_PAT AMP "&" ERROR - LIFETIME_IDENT "'l" - WHITESPACE " " + LIFETIME_IDENT "'l" [] [WHITESPACE(" ")] PARAM IDENT_PAT - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] ERROR SELF_KW "self" COLON ":" @@ -99,24 +86,21 @@ SOURCE_FILE IDENT_PAT NAME IDENT "S" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] REF_TYPE AMP "&" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "S" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 9: expected a name error 14: expected type error 15: expected `,` diff --git a/crates/parser/test_data/parser/inline/err/path_item_without_excl.rast b/crates/parser/test_data/parser/inline/err/path_item_without_excl.rast index a22dff1a679e..3be05ae1bd95 100644 --- a/crates/parser/test_data/parser/inline/err/path_item_without_excl.rast +++ b/crates/parser/test_data/parser/inline/err/path_item_without_excl.rast @@ -3,6 +3,6 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "foo" - WHITESPACE "\n" + IDENT "foo" [] [NEWLINE("\n")] + EOF "" error 3: expected an item diff --git a/crates/parser/test_data/parser/inline/err/pointer_type_no_mutability.rast b/crates/parser/test_data/parser/inline/err/pointer_type_no_mutability.rast index 354c4135a4d0..efea5fd483c0 100644 --- a/crates/parser/test_data/parser/inline/err/pointer_type_no_mutability.rast +++ b/crates/parser/test_data/parser/inline/err/pointer_type_no_mutability.rast @@ -1,17 +1,14 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" TUPLE_TYPE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 10: expected mut or const in raw pointer type (use `*mut T` or `*const T` as appropriate) diff --git a/crates/parser/test_data/parser/inline/err/postfix_dot_expr_ambiguity.rast b/crates/parser/test_data/parser/inline/err/postfix_dot_expr_ambiguity.rast index 4ee318de2515..06c5a37341f1 100644 --- a/crates/parser/test_data/parser/inline/err/postfix_dot_expr_ambiguity.rast +++ b/crates/parser/test_data/parser/inline/err/postfix_dot_expr_ambiguity.rast @@ -1,29 +1,24 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] METHOD_CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "x" - DOT "." - WHITESPACE "\n " + IDENT "x" [WHITESPACE(" ")] [] + DOT "." [] [NEWLINE("\n")] ARG_LIST - L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + L_PAREN "(" [WHITESPACE(" ")] [] + R_PAREN ")" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 17: expected method name, field name or number diff --git a/crates/parser/test_data/parser/inline/err/precise_capturing_invalid.rast b/crates/parser/test_data/parser/inline/err/precise_capturing_invalid.rast index 5ae184c5febc..8ecc536c1995 100644 --- a/crates/parser/test_data/parser/inline/err/precise_capturing_invalid.rast +++ b/crates/parser/test_data/parser/inline/err/precise_capturing_invalid.rast @@ -1,15 +1,11 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] IMPL_TRAIT_TYPE - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND USE_KW "use" @@ -17,12 +13,11 @@ SOURCE_FILE L_ANGLE "<" ERROR SELF_KW "self" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ERROR INT_NUMBER "1" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 18: expected identifier or `Self` error 24: expected identifier or `Self` diff --git a/crates/parser/test_data/parser/inline/err/pub_expr.rast b/crates/parser/test_data/parser/inline/err/pub_expr.rast index 0ae9f64e7e63..6be4872fb83b 100644 --- a/crates/parser/test_data/parser/inline/err/pub_expr.rast +++ b/crates/parser/test_data/parser/inline/err/pub_expr.rast @@ -1,26 +1,21 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] ERROR VISIBILITY - PUB_KW "pub" - WHITESPACE " " + PUB_KW "pub" [] [WHITESPACE(" ")] EXPR_STMT LITERAL INT_NUMBER "92" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 14: expected an item diff --git a/crates/parser/test_data/parser/inline/err/record_literal_before_ellipsis_recovery.rast b/crates/parser/test_data/parser/inline/err/record_literal_before_ellipsis_recovery.rast index 12b4e233e304..05313c27537a 100644 --- a/crates/parser/test_data/parser/inline/err/record_literal_before_ellipsis_recovery.rast +++ b/crates/parser/test_data/parser/inline/err/record_literal_before_ellipsis_recovery.rast @@ -1,31 +1,25 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD NAME_REF - IDENT "field" - WHITESPACE " " + IDENT "field" [] [WHITESPACE(" ")] DOT2 ".." CALL_EXPR PATH_EXPR @@ -40,24 +34,19 @@ SOURCE_FILE IDENT "default" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n " + R_PAREN ")" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD NAME_REF - INT_NUMBER "0" - WHITESPACE " " + INT_NUMBER "0" [] [WHITESPACE(" ")] DOT2 ".." CALL_EXPR PATH_EXPR @@ -72,47 +61,35 @@ SOURCE_FILE IDENT "default" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n " + R_PAREN ")" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD NAME_REF - IDENT "field" - WHITESPACE " " - DOT2 ".." - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n " + IDENT "field" [] [WHITESPACE(" ")] + DOT2 ".." [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD NAME_REF - INT_NUMBER "0" - WHITESPACE " " - DOT2 ".." - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + INT_NUMBER "0" [] [WHITESPACE(" ")] + DOT2 ".." [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 25: expected `:` error 25: expected COMMA error 42: expected SEMICOLON diff --git a/crates/parser/test_data/parser/inline/err/record_literal_field_eq_recovery.rast b/crates/parser/test_data/parser/inline/err/record_literal_field_eq_recovery.rast index ad3b6f208e66..7e6da1d42388 100644 --- a/crates/parser/test_data/parser/inline/err/record_literal_field_eq_recovery.rast +++ b/crates/parser/test_data/parser/inline/err/record_literal_field_eq_recovery.rast @@ -1,68 +1,53 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD NAME_REF - IDENT "field" - WHITESPACE " " + IDENT "field" [] [WHITESPACE(" ")] ERROR - EQ "=" - WHITESPACE " " + EQ "=" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "foo" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n " + IDENT "foo" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD NAME_REF - INT_NUMBER "0" - WHITESPACE " " + INT_NUMBER "0" [] [WHITESPACE(" ")] ERROR - EQ "=" - WHITESPACE " " + EQ "=" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "foo" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + IDENT "foo" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 26: expected `:` error 33: expected SEMICOLON error 44: expected `:` diff --git a/crates/parser/test_data/parser/inline/err/record_literal_missing_ellipsis_recovery.rast b/crates/parser/test_data/parser/inline/err/record_literal_missing_ellipsis_recovery.rast index 9cd07d2ea389..c98014a4916b 100644 --- a/crates/parser/test_data/parser/inline/err/record_literal_missing_ellipsis_recovery.rast +++ b/crates/parser/test_data/parser/inline/err/record_literal_missing_ellipsis_recovery.rast @@ -1,27 +1,22 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -35,21 +30,17 @@ SOURCE_FILE IDENT "default" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" ERROR @@ -65,13 +56,11 @@ SOURCE_FILE IDENT "default" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 19: expected DOT2 error 43: expected DOT2 error 45: expected COMMA diff --git a/crates/parser/test_data/parser/inline/err/record_pat_field_eq_recovery.rast b/crates/parser/test_data/parser/inline/err/record_pat_field_eq_recovery.rast index 6940a84b6830..89bdde44ebe6 100644 --- a/crates/parser/test_data/parser/inline/err/record_pat_field_eq_recovery.rast +++ b/crates/parser/test_data/parser/inline/err/record_pat_field_eq_recovery.rast @@ -1,43 +1,33 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_PAT PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_PAT_FIELD NAME_REF - IDENT "field" - WHITESPACE " " + IDENT "field" [] [WHITESPACE(" ")] ERROR - EQ "=" - WHITESPACE " " + EQ "=" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "foo" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 30: expected `:` diff --git a/crates/parser/test_data/parser/inline/err/recover_from_missing_assoc_item_binding.rast b/crates/parser/test_data/parser/inline/err/recover_from_missing_assoc_item_binding.rast index fc59db84e77d..0f00c04605ac 100644 --- a/crates/parser/test_data/parser/inline/err/recover_from_missing_assoc_item_binding.rast +++ b/crates/parser/test_data/parser/inline/err/recover_from_missing_assoc_item_binding.rast @@ -1,19 +1,15 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] IMPL_TRAIT_TYPE - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -25,24 +21,18 @@ SOURCE_FILE L_ANGLE "<" ASSOC_TYPE_ARG NAME_REF - IDENT "Item" - WHITESPACE " " - EQ "=" - WHITESPACE " " - COMMA "," - WHITESPACE " " + IDENT "Item" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] + COMMA "," [] [WHITESPACE(" ")] ASSOC_TYPE_ARG NAME_REF - IDENT "Item" - WHITESPACE " " - EQ "=" - WHITESPACE " " - R_ANGLE ">" - WHITESPACE " " + IDENT "Item" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] + R_ANGLE ">" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 30: missing associated item binding error 39: missing associated item binding diff --git a/crates/parser/test_data/parser/inline/err/recover_from_missing_const_default.rast b/crates/parser/test_data/parser/inline/err/recover_from_missing_const_default.rast index 49f163b164ae..b9239dba3565 100644 --- a/crates/parser/test_data/parser/inline/err/recover_from_missing_const_default.rast +++ b/crates/parser/test_data/parser/inline/err/recover_from_missing_const_default.rast @@ -1,46 +1,37 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "A" GENERIC_PARAM_LIST L_ANGLE "<" CONST_PARAM - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] NAME IDENT "N" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "i32" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CONST_ARG - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] CONST_PARAM - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] NAME IDENT "M" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " + IDENT "i32" [] [WHITESPACE(" ")] EQ "=" CONST_ARG R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 24: expected a generic const argument error 40: expected a generic const argument diff --git a/crates/parser/test_data/parser/inline/err/static_where_clause.rast b/crates/parser/test_data/parser/inline/err/static_where_clause.rast index cde3e47ad5c3..96e59f65cde2 100644 --- a/crates/parser/test_data/parser/inline/err/static_where_clause.rast +++ b/crates/parser/test_data/parser/inline/err/static_where_clause.rast @@ -1,41 +1,34 @@ SOURCE_FILE STATIC - STATIC_KW "static" - WHITESPACE " " + STATIC_KW "static" [] [WHITESPACE(" ")] NAME IDENT "C" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u32" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "u32" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "0" - WHITESPACE "\n" + INT_NUMBER "0" [] [NEWLINE("\n")] ERROR - WHERE_KW "where" - WHITESPACE " " + WHERE_KW "where" [] [WHITESPACE(" ")] ERROR PATH PATH_SEGMENT NAME_REF IDENT "i32" ERROR - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] ERROR PATH PATH_SEGMENT NAME_REF IDENT "Copy" ERROR - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 17: expected SEMICOLON error 18: expected an item error 27: expected an item diff --git a/crates/parser/test_data/parser/inline/err/struct_field_recover.rast b/crates/parser/test_data/parser/inline/err/struct_field_recover.rast index 5a12c21b647d..42b374ae57f3 100644 --- a/crates/parser/test_data/parser/inline/err/struct_field_recover.rast +++ b/crates/parser/test_data/parser/inline/err/struct_field_recover.rast @@ -1,59 +1,44 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_FIELD NAME - IDENT "f" - WHITESPACE " " + IDENT "f" [] [WHITESPACE(" ")] RECORD_FIELD VISIBILITY - PUB_KW "pub" - WHITESPACE " " + PUB_KW "pub" [] [WHITESPACE(" ")] NAME IDENT "g" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + R_PAREN ")" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_FIELD NAME IDENT "f" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] RECORD_FIELD VISIBILITY - PUB_KW "pub" - WHITESPACE " " + PUB_KW "pub" [] [WHITESPACE(" ")] NAME IDENT "g" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + R_PAREN ")" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 12: expected COLON error 12: expected type error 12: expected COMMA diff --git a/crates/parser/test_data/parser/inline/err/top_level_let.rast b/crates/parser/test_data/parser/inline/err/top_level_let.rast index 5ddef5f3f03f..d21410ebcf1c 100644 --- a/crates/parser/test_data/parser/inline/err/top_level_let.rast +++ b/crates/parser/test_data/parser/inline/err/top_level_let.rast @@ -1,30 +1,23 @@ SOURCE_FILE ERROR - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT - REF_KW "ref" - WHITESPACE " " + REF_KW "ref" [] [WHITESPACE(" ")] NAME IDENT "foo" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] FN_PTR_TYPE FN_KW "fn" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "3" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 0: expected an item diff --git a/crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rast b/crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rast index 2ccd04c321e1..a948175af9dd 100644 --- a/crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rast +++ b/crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rast @@ -1,45 +1,38 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT TUPLE_EXPR - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] COMMA "," R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT TUPLE_EXPR - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "a" - COMMA "," - WHITESPACE " " - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] + COMMA "," [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "b" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 16: expected expression error 27: expected expression diff --git a/crates/parser/test_data/parser/inline/err/tuple_field_list_recovery.rast b/crates/parser/test_data/parser/inline/err/tuple_field_list_recovery.rast index 6b0bfa007e36..3b7701bee905 100644 --- a/crates/parser/test_data/parser/inline/err/tuple_field_list_recovery.rast +++ b/crates/parser/test_data/parser/inline/err/tuple_field_list_recovery.rast @@ -1,21 +1,17 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" TUPLE_FIELD_LIST L_PAREN "(" STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" TUPLE_FIELD_LIST @@ -36,8 +32,8 @@ SOURCE_FILE NAME_REF IDENT "B" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 9: expected a type error 9: expected R_PAREN error 9: expected SEMICOLON diff --git a/crates/parser/test_data/parser/inline/err/tuple_pat_leading_comma.rast b/crates/parser/test_data/parser/inline/err/tuple_pat_leading_comma.rast index 9c8837292d28..72260a91a480 100644 --- a/crates/parser/test_data/parser/inline/err/tuple_pat_leading_comma.rast +++ b/crates/parser/test_data/parser/inline/err/tuple_pat_leading_comma.rast @@ -1,26 +1,21 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_PAT L_PAREN "(" COMMA "," R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 21: expected pattern diff --git a/crates/parser/test_data/parser/inline/err/type_bounds_macro_call_recovery.rast b/crates/parser/test_data/parser/inline/err/type_bounds_macro_call_recovery.rast index 89128b21e83d..72c4a6838482 100644 --- a/crates/parser/test_data/parser/inline/err/type_bounds_macro_call_recovery.rast +++ b/crates/parser/test_data/parser/inline/err/type_bounds_macro_call_recovery.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" GENERIC_PARAM_LIST @@ -9,8 +8,7 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -23,13 +21,11 @@ SOURCE_FILE TOKEN_TREE L_BRACK "[" R_BRACK "]" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -39,13 +35,11 @@ SOURCE_FILE IDENT "T" ERROR BANG "!" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -61,11 +55,9 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -80,11 +72,9 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "T" - BANG "!" - WHITESPACE " " + BANG "!" [] [WHITESPACE(" ")] ERROR - PLUS "+" - WHITESPACE " " + PLUS "+" [] [WHITESPACE(" ")] MACRO_CALL PATH PATH_SEGMENT @@ -95,12 +85,11 @@ SOURCE_FILE L_CURLY "{" R_CURLY "}" ERROR - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] ERROR L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 12: unexpected `!` in type path, macro calls are not allowed here error 21: unexpected `!` in type path, macro calls are not allowed here error 28: unexpected `!` in type path, macro calls are not allowed here diff --git a/crates/parser/test_data/parser/inline/err/type_in_array_recover.rast b/crates/parser/test_data/parser/inline/err/type_in_array_recover.rast index db76e8d7c88a..093cbafed824 100644 --- a/crates/parser/test_data/parser/inline/err/type_in_array_recover.rast +++ b/crates/parser/test_data/parser/inline/err/type_in_array_recover.rast @@ -1,15 +1,13 @@ SOURCE_FILE CONST - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] SLICE_TYPE L_BRACK "[" REF_TYPE AMP "&" R_BRACK "]" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 11: expected type diff --git a/crates/parser/test_data/parser/inline/err/unsafe_block_in_mod.rast b/crates/parser/test_data/parser/inline/err/unsafe_block_in_mod.rast index 77c2b56adf26..0721d12564ef 100644 --- a/crates/parser/test_data/parser/inline/err/unsafe_block_in_mod.rast +++ b/crates/parser/test_data/parser/inline/err/unsafe_block_in_mod.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST @@ -10,19 +9,14 @@ SOURCE_FILE BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE " " + R_CURLY "}" [] [WHITESPACE(" ")] ERROR - UNSAFE_KW "unsafe" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] ERROR - L_CURLY "{" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "bar" PARAM_LIST @@ -31,7 +25,7 @@ SOURCE_FILE BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" error 11: expected an item error 18: expected an item diff --git a/crates/parser/test_data/parser/inline/err/use_tree_list_err_recovery.rast b/crates/parser/test_data/parser/inline/err/use_tree_list_err_recovery.rast index b576d872e132..65bd7b5dfe6e 100644 --- a/crates/parser/test_data/parser/inline/err/use_tree_list_err_recovery.rast +++ b/crates/parser/test_data/parser/inline/err/use_tree_list_err_recovery.rast @@ -1,7 +1,6 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE USE_TREE_LIST L_CURLY "{" @@ -10,42 +9,33 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "a" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT NAME_REF IDENT "b" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "T" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "test" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE USE_TREE_LIST L_CURLY "{" @@ -53,19 +43,17 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] COMMA "," ERROR - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT NAME_REF IDENT "b" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" error 6: expected R_CURLY error 46: expected use tree diff --git a/crates/parser/test_data/parser/inline/ok/anonymous_const.rast b/crates/parser/test_data/parser/inline/ok/anonymous_const.rast index d81b4ff26702..57d609f8d8b2 100644 --- a/crates/parser/test_data/parser/inline/ok/anonymous_const.rast +++ b/crates/parser/test_data/parser/inline/ok/anonymous_const.rast @@ -1,19 +1,15 @@ SOURCE_FILE CONST - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u32" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "u32" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/arb_self_types.rast b/crates/parser/test_data/parser/inline/ok/arb_self_types.rast index a0b562629624..dea4fc4fa8d2 100644 --- a/crates/parser/test_data/parser/inline/ok/arb_self_types.rast +++ b/crates/parser/test_data/parser/inline/ok/arb_self_types.rast @@ -1,19 +1,15 @@ SOURCE_FILE IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "a" PARAM_LIST @@ -21,8 +17,7 @@ SOURCE_FILE SELF_PARAM NAME SELF_KW "self" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] REF_TYPE AMP "&" PATH_TYPE @@ -30,27 +25,22 @@ SOURCE_FILE PATH_SEGMENT NAME_REF SELF_TYPE_KW "Self" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "b" PARAM_LIST L_PAREN "(" SELF_PARAM - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] NAME SELF_KW "self" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -65,12 +55,10 @@ SOURCE_FILE NAME_REF SELF_TYPE_KW "Self" R_ANGLE ">" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/arg_with_attr.rast b/crates/parser/test_data/parser/inline/ok/arg_with_attr.rast index 672f2c2f7f99..2ef39aecd518 100644 --- a/crates/parser/test_data/parser/inline/ok/arg_with_attr.rast +++ b/crates/parser/test_data/parser/inline/ok/arg_with_attr.rast @@ -1,23 +1,20 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "foo" + IDENT "foo" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" LITERAL @@ -29,10 +26,8 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] INT_NUMBER "92" - R_PAREN ")" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/array_attrs.rast b/crates/parser/test_data/parser/inline/ok/array_attrs.rast index 2812bbf71bcc..8618a1782211 100644 --- a/crates/parser/test_data/parser/inline/ok/array_attrs.rast +++ b/crates/parser/test_data/parser/inline/ok/array_attrs.rast @@ -1,11 +1,9 @@ SOURCE_FILE CONST - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] NAME IDENT "A" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] REF_TYPE AMP "&" SLICE_TYPE @@ -15,18 +13,15 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "i64" - R_BRACK "]" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_EXPR AMP "&" ARRAY_EXPR L_BRACK "[" LITERAL INT_NUMBER "1" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LITERAL ATTR POUND "#" @@ -37,9 +32,8 @@ SOURCE_FILE CFG_ATOM IDENT "test" R_PAREN ")" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] INT_NUMBER "2" R_BRACK "]" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/array_expr.rast b/crates/parser/test_data/parser/inline/ok/array_expr.rast index 60395948c185..f277897e3b04 100644 --- a/crates/parser/test_data/parser/inline/ok/array_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/array_expr.rast @@ -1,55 +1,46 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT ARRAY_EXPR - L_BRACK "[" + L_BRACK "[" [WHITESPACE(" ")] [] R_BRACK "]" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT ARRAY_EXPR - L_BRACK "[" + L_BRACK "[" [WHITESPACE(" ")] [] LITERAL INT_NUMBER "1" R_BRACK "]" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT ARRAY_EXPR - L_BRACK "[" + L_BRACK "[" [WHITESPACE(" ")] [] LITERAL INT_NUMBER "1" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" COMMA "," R_BRACK "]" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT ARRAY_EXPR - L_BRACK "[" + L_BRACK "[" [WHITESPACE(" ")] [] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" R_BRACK "]" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/array_type.rast b/crates/parser/test_data/parser/inline/ok/array_type.rast index 0d50144b7300..7d1351500823 100644 --- a/crates/parser/test_data/parser/inline/ok/array_type.rast +++ b/crates/parser/test_data/parser/inline/ok/array_type.rast @@ -1,22 +1,18 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] ARRAY_TYPE L_BRACK "[" TUPLE_TYPE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] CONST_ARG LITERAL INT_NUMBER "92" R_BRACK "]" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/as_precedence.rast b/crates/parser/test_data/parser/inline/ok/as_precedence.rast index 4079d2a9915d..9dc157b495d3 100644 --- a/crates/parser/test_data/parser/inline/ok/as_precedence.rast +++ b/crates/parser/test_data/parser/inline/ok/as_precedence.rast @@ -1,43 +1,33 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CAST_EXPR REF_EXPR AMP "&" LITERAL - INT_NUMBER "1" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/asm_expr.rast b/crates/parser/test_data/parser/inline/ok/asm_expr.rast index f0213d0b5e36..038cb83a60a9 100644 --- a/crates/parser/test_data/parser/inline/ok/asm_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/asm_expr.rast @@ -1,46 +1,36 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT ASM_EXPR - BUILTIN_KW "builtin" + BUILTIN_KW "builtin" [WHITESPACE(" ")] [] POUND "#" ASM_KW "asm" - L_PAREN "(" - WHITESPACE "\n " + L_PAREN "(" [] [NEWLINE("\n")] LITERAL - STRING "\"mov {tmp}, {x}\"" - COMMA "," - WHITESPACE "\n " + STRING "\"mov {tmp}, {x}\"" [WHITESPACE(" ")] [] + COMMA "," [] [NEWLINE("\n")] LITERAL - STRING "\"shl {tmp}, 1\"" - COMMA "," - WHITESPACE "\n " + STRING "\"shl {tmp}, 1\"" [WHITESPACE(" ")] [] + COMMA "," [] [NEWLINE("\n")] LITERAL - STRING "\"shl {x}, 2\"" - COMMA "," - WHITESPACE "\n " + STRING "\"shl {x}, 2\"" [WHITESPACE(" ")] [] + COMMA "," [] [NEWLINE("\n")] LITERAL - STRING "\"add {x}, {tmp}\"" - COMMA "," - WHITESPACE "\n " + STRING "\"add {x}, {tmp}\"" [WHITESPACE(" ")] [] + COMMA "," [] [NEWLINE("\n")] ASM_OPERAND_NAMED NAME - IDENT "x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "x" [WHITESPACE(" ")] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] ASM_REG_OPERAND ASM_DIR_SPEC INOUT_KW "inout" @@ -48,22 +38,18 @@ SOURCE_FILE ASM_REG_SPEC NAME_REF IDENT "reg" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] ASM_OPERAND_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "x" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] ASM_OPERAND_NAMED NAME - IDENT "tmp" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "tmp" [WHITESPACE(" ")] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] ASM_REG_OPERAND ASM_DIR_SPEC OUT_KW "out" @@ -71,15 +57,12 @@ SOURCE_FILE ASM_REG_SPEC NAME_REF IDENT "reg" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] ASM_OPERAND_EXPR UNDERSCORE_EXPR UNDERSCORE "_" - COMMA "," - WHITESPACE "\n " - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] + R_PAREN ")" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/asm_keyword_name.rast b/crates/parser/test_data/parser/inline/ok/asm_keyword_name.rast index 4c97562f9a43..413922d84b1b 100644 --- a/crates/parser/test_data/parser/inline/ok/asm_keyword_name.rast +++ b/crates/parser/test_data/parser/inline/ok/asm_keyword_name.rast @@ -1,42 +1,32 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT ASM_EXPR - BUILTIN_KW "builtin" - WHITESPACE " " - POUND "#" - WHITESPACE " " + BUILTIN_KW "builtin" [WHITESPACE(" ")] [WHITESPACE(" ")] + POUND "#" [] [WHITESPACE(" ")] ASM_KW "asm" L_PAREN "(" LITERAL STRING "\"\"" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASM_OPERAND_NAMED NAME - IDENT "fn" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "fn" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] ASM_CONST - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/asm_kinds.rast b/crates/parser/test_data/parser/inline/ok/asm_kinds.rast index c337d89aa509..73fec5b51c7e 100644 --- a/crates/parser/test_data/parser/inline/ok/asm_kinds.rast +++ b/crates/parser/test_data/parser/inline/ok/asm_kinds.rast @@ -1,48 +1,42 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT ASM_EXPR - BUILTIN_KW "builtin" + BUILTIN_KW "builtin" [WHITESPACE(" ")] [] POUND "#" ASM_KW "asm" L_PAREN "(" LITERAL STRING "\"\"" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] ASM_EXPR - BUILTIN_KW "builtin" + BUILTIN_KW "builtin" [WHITESPACE(" ")] [] POUND "#" GLOBAL_ASM_KW "global_asm" L_PAREN "(" LITERAL STRING "\"\"" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT ASM_EXPR - BUILTIN_KW "builtin" + BUILTIN_KW "builtin" [WHITESPACE(" ")] [] POUND "#" NAKED_ASM_KW "naked_asm" L_PAREN "(" LITERAL STRING "\"\"" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/asm_label.rast b/crates/parser/test_data/parser/inline/ok/asm_label.rast index 38999c9cd34f..5672eaee65c1 100644 --- a/crates/parser/test_data/parser/inline/ok/asm_label.rast +++ b/crates/parser/test_data/parser/inline/ok/asm_label.rast @@ -1,37 +1,31 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT ASM_EXPR - BUILTIN_KW "builtin" + BUILTIN_KW "builtin" [WHITESPACE(" ")] [] POUND "#" ASM_KW "asm" L_PAREN "(" LITERAL STRING "\"\"" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASM_OPERAND_NAMED ASM_LABEL - LABEL_KW "label" - WHITESPACE " " + LABEL_KW "label" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/asm_piece_attr.rast b/crates/parser/test_data/parser/inline/ok/asm_piece_attr.rast index 1fa9cd6dd7b6..ab76f67e1cc3 100644 --- a/crates/parser/test_data/parser/inline/ok/asm_piece_attr.rast +++ b/crates/parser/test_data/parser/inline/ok/asm_piece_attr.rast @@ -1,15 +1,12 @@ SOURCE_FILE ASM_EXPR - BUILTIN_KW "builtin" - WHITESPACE " " - POUND "#" - WHITESPACE " " + BUILTIN_KW "builtin" [] [WHITESPACE(" ")] + POUND "#" [] [WHITESPACE(" ")] GLOBAL_ASM_KW "global_asm" L_PAREN "(" LITERAL STRING "\"\"" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASM_OPTIONS ATTR POUND "#" @@ -20,10 +17,9 @@ SOURCE_FILE CFG_ATOM FALSE_KW "false" R_PAREN ")" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] OPTIONS_KW "options" L_PAREN "(" R_PAREN ")" - R_PAREN ")" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/asm_sym_paren.rast b/crates/parser/test_data/parser/inline/ok/asm_sym_paren.rast index d189f63f2afc..03b2b17e7570 100644 --- a/crates/parser/test_data/parser/inline/ok/asm_sym_paren.rast +++ b/crates/parser/test_data/parser/inline/ok/asm_sym_paren.rast @@ -1,36 +1,29 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT ASM_EXPR - BUILTIN_KW "builtin" + BUILTIN_KW "builtin" [WHITESPACE(" ")] [] POUND "#" ASM_KW "asm" L_PAREN "(" LITERAL STRING "\"\"" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASM_OPERAND_NAMED NAME - IDENT "f" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "f" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] ASM_SYM - SYM_KW "sym" - WHITESPACE " " + SYM_KW "sym" [] [WHITESPACE(" ")] L_PAREN "(" PATH PATH @@ -43,7 +36,6 @@ SOURCE_FILE IDENT "bar" R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/assoc_const_eq.rast b/crates/parser/test_data/parser/inline/ok/assoc_const_eq.rast index fa2733e7f96c..9d2a455f0446 100644 --- a/crates/parser/test_data/parser/inline/ok/assoc_const_eq.rast +++ b/crates/parser/test_data/parser/inline/ok/assoc_const_eq.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" GENERIC_PARAM_LIST @@ -9,8 +8,7 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "F" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -31,35 +29,27 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] CONST - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] NAME IDENT "TEST" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "usize" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "usize" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "3" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "bar" GENERIC_PARAM_LIST @@ -67,8 +57,7 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "F" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -96,10 +85,9 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/assoc_item_list.rast b/crates/parser/test_data/parser/inline/ok/assoc_item_list.rast index def7373c9de0..21a939ffeac4 100644 --- a/crates/parser/test_data/parser/inline/ok/assoc_item_list.rast +++ b/crates/parser/test_data/parser/inline/ok/assoc_item_list.rast @@ -1,67 +1,51 @@ SOURCE_FILE IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "F" - WHITESPACE " " + IDENT "F" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME - IDENT "A" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "A" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] CONST - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "B" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "i32" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "92" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "bar" PARAM_LIST @@ -70,12 +54,10 @@ SOURCE_FILE AMP "&" NAME SELF_KW "self" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/assoc_item_list_inner_attrs.rast b/crates/parser/test_data/parser/inline/ok/assoc_item_list_inner_attrs.rast index 7c6dbf65cfdc..04448eede4bb 100644 --- a/crates/parser/test_data/parser/inline/ok/assoc_item_list_inner_attrs.rast +++ b/crates/parser/test_data/parser/inline/ok/assoc_item_list_inner_attrs.rast @@ -1,16 +1,13 @@ SOURCE_FILE IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] ATTR POUND "#" BANG "!" @@ -20,7 +17,6 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr" - R_BRACK "]" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + R_BRACK "]" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/assoc_type_bound.rast b/crates/parser/test_data/parser/inline/ok/assoc_type_bound.rast index 0f62e1dd184c..4a538fd0d818 100644 --- a/crates/parser/test_data/parser/inline/ok/assoc_type_bound.rast +++ b/crates/parser/test_data/parser/inline/ok/assoc_type_bound.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -23,8 +20,7 @@ SOURCE_FILE LIFETIME LIFETIME_IDENT "'a" R_ANGLE ">" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -33,16 +29,12 @@ SOURCE_FILE NAME_REF IDENT "Clone" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -62,8 +54,7 @@ SOURCE_FILE NAME_REF IDENT "T" R_PAREN ")" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -72,5 +63,5 @@ SOURCE_FILE NAME_REF IDENT "Clone" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/assoc_type_eq.rast b/crates/parser/test_data/parser/inline/ok/assoc_type_eq.rast index 970431840364..af3b193d9cb4 100644 --- a/crates/parser/test_data/parser/inline/ok/assoc_type_eq.rast +++ b/crates/parser/test_data/parser/inline/ok/assoc_type_eq.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -22,20 +19,17 @@ SOURCE_FILE LIFETIME_ARG LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "T" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/async_trait_bound.rast b/crates/parser/test_data/parser/inline/ok/async_trait_bound.rast index df0ba55d03d6..f49252430b14 100644 --- a/crates/parser/test_data/parser/inline/ok/async_trait_bound.rast +++ b/crates/parser/test_data/parser/inline/ok/async_trait_bound.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "async_foo" PARAM_LIST @@ -9,15 +8,12 @@ SOURCE_FILE PARAM WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] IMPL_TRAIT_TYPE - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND - ASYNC_KW "async" - WHITESPACE " " + ASYNC_KW "async" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -34,10 +30,9 @@ SOURCE_FILE NAME_REF IDENT "i32" R_PAREN ")" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/attr_on_expr_stmt.rast b/crates/parser/test_data/parser/inline/ok/attr_on_expr_stmt.rast index 248e6d1360db..b7110fb1965a 100644 --- a/crates/parser/test_data/parser/inline/ok/attr_on_expr_stmt.rast +++ b/crates/parser/test_data/parser/inline/ok/attr_on_expr_stmt.rast @@ -1,29 +1,25 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] L_BRACK "[" PATH_META PATH PATH_SEGMENT NAME_REF IDENT "A" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT @@ -32,20 +28,18 @@ SOURCE_FILE ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT MACRO_EXPR ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] L_BRACK "[" PATH_META PATH PATH_SEGMENT NAME_REF IDENT "B" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] MACRO_CALL PATH PATH_SEGMENT @@ -54,20 +48,18 @@ SOURCE_FILE BANG "!" TOKEN_TREE L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] L_BRACK "[" PATH_META PATH PATH_SEGMENT NAME_REF IDENT "C" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] ATTR POUND "#" L_BRACK "[" @@ -76,30 +68,25 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "D" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT RETURN_EXPR ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] L_BRACK "[" PATH_META PATH PATH_SEGMENT NAME_REF IDENT "D" - R_BRACK "]" - WHITESPACE " " - RETURN_KW "return" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + RETURN_KW "return" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/await_expr.rast b/crates/parser/test_data/parser/inline/ok/await_expr.rast index af713a22072f..0211b38d4027 100644 --- a/crates/parser/test_data/parser/inline/ok/await_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/await_expr.rast @@ -1,28 +1,24 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT AWAIT_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] DOT "." AWAIT_KW "await" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT AWAIT_EXPR FIELD_EXPR @@ -30,14 +26,13 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] DOT "." NAME_REF INT_NUMBER "0" DOT "." AWAIT_KW "await" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT METHOD_CALL_EXPR TRY_EXPR @@ -48,7 +43,7 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] DOT "." NAME_REF INT_NUMBER "0" @@ -64,8 +59,7 @@ SOURCE_FILE ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT AWAIT_EXPR FIELD_EXPR @@ -74,7 +68,7 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] DOT "." NAME_REF INT_NUMBER "0" @@ -83,8 +77,7 @@ SOURCE_FILE INT_NUMBER "0" DOT "." AWAIT_KW "await" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT AWAIT_EXPR FIELD_EXPR @@ -92,14 +85,12 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] DOT "." NAME_REF INT_NUMBER "0" - DOT "." - WHITESPACE " " + DOT "." [] [WHITESPACE(" ")] AWAIT_KW "await" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/bare_dyn_types_with_leading_lifetime.rast b/crates/parser/test_data/parser/inline/ok/bare_dyn_types_with_leading_lifetime.rast index d7e67fbcd15c..d10e8174a6f8 100644 --- a/crates/parser/test_data/parser/inline/ok/bare_dyn_types_with_leading_lifetime.rast +++ b/crates/parser/test_data/parser/inline/ok/bare_dyn_types_with_leading_lifetime.rast @@ -1,36 +1,27 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "A" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "A" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] DYN_TRAIT_TYPE TYPE_BOUND_LIST TYPE_BOUND LIFETIME - LIFETIME_IDENT "'static" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + LIFETIME_IDENT "'static" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Trait" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "B" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "B" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -43,10 +34,8 @@ SOURCE_FILE TYPE_BOUND_LIST TYPE_BOUND LIFETIME - LIFETIME_IDENT "'static" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + LIFETIME_IDENT "'static" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH @@ -54,5 +43,5 @@ SOURCE_FILE NAME_REF IDENT "Trait" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/become_expr.rast b/crates/parser/test_data/parser/inline/ok/become_expr.rast index c544cf4e5e3e..d0b99749f4e0 100644 --- a/crates/parser/test_data/parser/inline/ok/become_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/become_expr.rast @@ -1,21 +1,17 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BECOME_EXPR - BECOME_KW "become" - WHITESPACE " " + BECOME_KW "become" [WHITESPACE(" ")] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -25,7 +21,6 @@ SOURCE_FILE ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/bind_pat.rast b/crates/parser/test_data/parser/inline/ok/bind_pat.rast index eb1c32474a24..32b610589527 100644 --- a/crates/parser/test_data/parser/inline/ok/bind_pat.rast +++ b/crates/parser/test_data/parser/inline/ok/bind_pat.rast @@ -1,128 +1,89 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] NAME - IDENT "b" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "b" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT - REF_KW "ref" - WHITESPACE " " + REF_KW "ref" [] [WHITESPACE(" ")] NAME - IDENT "c" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "c" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT - REF_KW "ref" - WHITESPACE " " - MUT_KW "mut" - WHITESPACE " " + REF_KW "ref" [] [WHITESPACE(" ")] + MUT_KW "mut" [] [WHITESPACE(" ")] NAME - IDENT "d" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "d" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "e" - WHITESPACE " " - AT "@" - WHITESPACE " " + IDENT "e" [] [WHITESPACE(" ")] + AT "@" [] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT - REF_KW "ref" - WHITESPACE " " - MUT_KW "mut" - WHITESPACE " " + REF_KW "ref" [] [WHITESPACE(" ")] + MUT_KW "mut" [] [WHITESPACE(" ")] NAME - IDENT "f" - WHITESPACE " " - AT "@" - WHITESPACE " " + IDENT "f" [] [WHITESPACE(" ")] + AT "@" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "g" - WHITESPACE " " - AT "@" - WHITESPACE " " + IDENT "g" [] [WHITESPACE(" ")] + AT "@" [] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/binop_resets_statementness.rast b/crates/parser/test_data/parser/inline/ok/binop_resets_statementness.rast index f667c1972dd0..a6c4d62075fa 100644 --- a/crates/parser/test_data/parser/inline/ok/binop_resets_statementness.rast +++ b/crates/parser/test_data/parser/inline/ok/binop_resets_statementness.rast @@ -1,27 +1,22 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "v" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "v" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR BLOCK_EXPR STMT_LIST @@ -32,7 +27,6 @@ SOURCE_FILE AMP "&" LITERAL INT_NUMBER "2" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/block.rast b/crates/parser/test_data/parser/inline/ok/block.rast index a23364d152c6..fb6c6eb1dda3 100644 --- a/crates/parser/test_data/parser/inline/ok/block.rast +++ b/crates/parser/test_data/parser/inline/ok/block.rast @@ -1,90 +1,68 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "a" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "b" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "c" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] EXPR_STMT LITERAL INT_NUMBER "2" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "d" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "2" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + INT_NUMBER "2" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/block_items.rast b/crates/parser/test_data/parser/inline/ok/block_items.rast index 2e4b515cab99..f3724a964b70 100644 --- a/crates/parser/test_data/parser/inline/ok/block_items.rast +++ b/crates/parser/test_data/parser/inline/ok/block_items.rast @@ -1,30 +1,24 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "a" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "b" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/box_pat.rast b/crates/parser/test_data/parser/inline/ok/box_pat.rast index df22decde124..93b866484a78 100644 --- a/crates/parser/test_data/parser/inline/ok/box_pat.rast +++ b/crates/parser/test_data/parser/inline/ok/box_pat.rast @@ -1,66 +1,50 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] BOX_PAT - BOX_KW "box" - WHITESPACE " " + BOX_KW "box" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "i" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "i" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] BOX_PAT - BOX_KW "box" - WHITESPACE " " + BOX_KW "box" [] [WHITESPACE(" ")] RECORD_PAT PATH PATH_SEGMENT NAME_REF - IDENT "Outer" - WHITESPACE " " + IDENT "Outer" [] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_PAT_FIELD BOX_PAT - BOX_KW "box" - WHITESPACE " " + BOX_KW "box" [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "i" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] RECORD_PAT_FIELD NAME_REF IDENT "j" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] BOX_PAT - BOX_KW "box" - WHITESPACE " " + BOX_KW "box" [] [WHITESPACE(" ")] TUPLE_STRUCT_PAT PATH PATH_SEGMENT @@ -68,44 +52,32 @@ SOURCE_FILE IDENT "Inner" L_PAREN "(" BOX_PAT - BOX_KW "box" - WHITESPACE " " + BOX_KW "box" [] [WHITESPACE(" ")] REF_PAT AMP "&" IDENT_PAT NAME IDENT "x" - R_PAREN ")" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] BOX_PAT - BOX_KW "box" - WHITESPACE " " + BOX_KW "box" [] [WHITESPACE(" ")] IDENT_PAT - REF_KW "ref" - WHITESPACE " " - MUT_KW "mut" - WHITESPACE " " + REF_KW "ref" [] [WHITESPACE(" ")] + MUT_KW "mut" [] [WHITESPACE(" ")] NAME - IDENT "i" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "i" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/break_ambiguity.rast b/crates/parser/test_data/parser/inline/ok/break_ambiguity.rast index cbf5e84e8cdc..cddab49eb9c8 100644 --- a/crates/parser/test_data/parser/inline/ok/break_ambiguity.rast +++ b/crates/parser/test_data/parser/inline/ok/break_ambiguity.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST @@ -9,59 +8,44 @@ SOURCE_FILE R_PAREN ")" BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] BREAK_EXPR - BREAK_KW "break" - WHITESPACE " " + BREAK_KW "break" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT WHILE_EXPR - WHILE_KW "while" - WHITESPACE " " + WHILE_KW "while" [WHITESPACE(" ")] [WHITESPACE(" ")] BREAK_EXPR - BREAK_KW "break" - WHITESPACE " " + BREAK_KW "break" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT FOR_EXPR - FOR_KW "for" - WHITESPACE " " + FOR_KW "for" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "i" - WHITESPACE " " - IN_KW "in" - WHITESPACE " " + IDENT "i" [] [WHITESPACE(" ")] + IN_KW "in" [] [WHITESPACE(" ")] BREAK_EXPR - BREAK_KW "break" - WHITESPACE " " + BREAK_KW "break" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] BREAK_EXPR - BREAK_KW "break" - WHITESPACE " " + BREAK_KW "break" [] [WHITESPACE(" ")] MATCH_ARM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/break_expr.rast b/crates/parser/test_data/parser/inline/ok/break_expr.rast index 06c053d0f823..3cb7f86e0ae6 100644 --- a/crates/parser/test_data/parser/inline/ok/break_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/break_expr.rast @@ -1,57 +1,43 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LOOP_EXPR - LOOP_KW "loop" - WHITESPACE " " + LOOP_KW "loop" [WHITESPACE(" ")] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BREAK_EXPR - BREAK_KW "break" - SEMICOLON ";" - WHITESPACE "\n " + BREAK_KW "break" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BREAK_EXPR - BREAK_KW "break" - WHITESPACE " " + BREAK_KW "break" [WHITESPACE(" ")] [WHITESPACE(" ")] LIFETIME LIFETIME_IDENT "'l" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BREAK_EXPR - BREAK_KW "break" - WHITESPACE " " + BREAK_KW "break" [WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL INT_NUMBER "92" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BREAK_EXPR - BREAK_KW "break" - WHITESPACE " " + BREAK_KW "break" [WHITESPACE(" ")] [WHITESPACE(" ")] LIFETIME - LIFETIME_IDENT "'l" - WHITESPACE " " + LIFETIME_IDENT "'l" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "92" - SEMICOLON ";" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/builtin_expr.rast b/crates/parser/test_data/parser/inline/ok/builtin_expr.rast index 19a84ac54096..247febffc77e 100644 --- a/crates/parser/test_data/parser/inline/ok/builtin_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/builtin_expr.rast @@ -1,85 +1,70 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT ASM_EXPR - BUILTIN_KW "builtin" + BUILTIN_KW "builtin" [WHITESPACE(" ")] [] POUND "#" ASM_KW "asm" L_PAREN "(" LITERAL STRING "\"\"" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT FORMAT_ARGS_EXPR - BUILTIN_KW "builtin" + BUILTIN_KW "builtin" [WHITESPACE(" ")] [] POUND "#" FORMAT_ARGS_KW "format_args" L_PAREN "(" LITERAL STRING "\"\"" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] FORMAT_ARGS_ARG LITERAL INT_NUMBER "0" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] FORMAT_ARGS_ARG LITERAL INT_NUMBER "1" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] FORMAT_ARGS_ARG NAME - IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR LITERAL - INT_NUMBER "2" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + INT_NUMBER "2" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "3" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] FORMAT_ARGS_ARG BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "b" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT OFFSET_OF_EXPR - BUILTIN_KW "builtin" + BUILTIN_KW "builtin" [WHITESPACE(" ")] [] POUND "#" OFFSET_OF_KW "offset_of" L_PAREN "(" @@ -88,8 +73,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Foo" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] NAME_REF IDENT "bar" DOT "." @@ -99,7 +83,6 @@ SOURCE_FILE NAME_REF INT_NUMBER "0" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/call_expr.rast b/crates/parser/test_data/parser/inline/ok/call_expr.rast index 7c1d894f7e4c..2de49f79e3c0 100644 --- a/crates/parser/test_data/parser/inline/ok/call_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/call_expr.rast @@ -1,25 +1,19 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -29,16 +23,12 @@ SOURCE_FILE ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CALL_EXPR CALL_EXPR CALL_EXPR @@ -59,22 +49,17 @@ SOURCE_FILE L_PAREN "(" LITERAL INT_NUMBER "1" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" COMMA "," R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -104,15 +89,14 @@ SOURCE_FILE L_PAREN "(" R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "f" + IDENT "f" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" CALL_EXPR @@ -126,10 +110,8 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "Foo" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -144,7 +126,6 @@ SOURCE_FILE L_PAREN "(" R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/cast_expr.rast b/crates/parser/test_data/parser/inline/ok/cast_expr.rast index d53dde53811b..97974f3948e9 100644 --- a/crates/parser/test_data/parser/inline/ok/cast_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/cast_expr.rast @@ -1,90 +1,69 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT CAST_EXPR LITERAL - INT_NUMBER "82" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + INT_NUMBER "82" [WHITESPACE(" ")] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR CAST_EXPR LITERAL - INT_NUMBER "81" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + INT_NUMBER "81" [WHITESPACE(" ")] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i8" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "i8" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR CAST_EXPR LITERAL - INT_NUMBER "79" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + INT_NUMBER "79" [WHITESPACE(" ")] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i16" - WHITESPACE " " - MINUS "-" - WHITESPACE " " + IDENT "i16" [] [WHITESPACE(" ")] + MINUS "-" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR CAST_EXPR LITERAL - INT_NUMBER "0x36" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + INT_NUMBER "0x36" [WHITESPACE(" ")] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u8" - WHITESPACE " " - LTEQ "<=" - WHITESPACE " " + IDENT "u8" [] [WHITESPACE(" ")] + LTEQ "<=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0x37" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/cfg_attr.rast b/crates/parser/test_data/parser/inline/ok/cfg_attr.rast index 9af94f447db8..e339eb1fd848 100644 --- a/crates/parser/test_data/parser/inline/ok/cfg_attr.rast +++ b/crates/parser/test_data/parser/inline/ok/cfg_attr.rast @@ -12,8 +12,7 @@ SOURCE_FILE CFG_ATOM IDENT "foo" R_PAREN ")" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] UNSAFE_META UNSAFE_KW "unsafe" L_PAREN "(" @@ -26,8 +25,7 @@ SOURCE_FILE L_PAREN "(" R_PAREN ")" R_PAREN ")" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] CFG_ATTR_META CFG_ATTR_KW "cfg_attr" L_PAREN "(" @@ -36,28 +34,22 @@ SOURCE_FILE L_PAREN "(" CFG_ATOM TRUE_KW "true" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] CFG_ATOM - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] STRING "\"bar\"" R_PAREN ")" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] KEY_VALUE_META PATH PATH_SEGMENT NAME_REF - IDENT "baz" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "baz" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL STRING "\"baz\"" R_PAREN ")" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/cfg_composite_pred.rast b/crates/parser/test_data/parser/inline/ok/cfg_composite_pred.rast index 89d06d134fe2..5241b9c81609 100644 --- a/crates/parser/test_data/parser/inline/ok/cfg_composite_pred.rast +++ b/crates/parser/test_data/parser/inline/ok/cfg_composite_pred.rast @@ -11,23 +11,19 @@ SOURCE_FILE L_PAREN "(" CFG_ATOM IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] CFG_COMPOSITE IDENT "all" L_PAREN "(" CFG_ATOM - IDENT "b" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "b" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] STRING "\"c\"" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] CFG_ATOM IDENT "d" R_PAREN ")" R_PAREN ")" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/cfg_key_value_pred.rast b/crates/parser/test_data/parser/inline/ok/cfg_key_value_pred.rast index e48d39bf55db..80c0c631861d 100644 --- a/crates/parser/test_data/parser/inline/ok/cfg_key_value_pred.rast +++ b/crates/parser/test_data/parser/inline/ok/cfg_key_value_pred.rast @@ -7,11 +7,9 @@ SOURCE_FILE CFG_KW "cfg" L_PAREN "(" CFG_ATOM - IDENT "key" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "key" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] STRING "\"value\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/cfg_meta.rast b/crates/parser/test_data/parser/inline/ok/cfg_meta.rast index f024cfd1aae4..a7a107bdb713 100644 --- a/crates/parser/test_data/parser/inline/ok/cfg_meta.rast +++ b/crates/parser/test_data/parser/inline/ok/cfg_meta.rast @@ -9,8 +9,7 @@ SOURCE_FILE CFG_ATOM IDENT "foo" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -19,12 +18,10 @@ SOURCE_FILE CFG_KW "cfg" L_PAREN "(" CFG_ATOM - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] STRING "\"bar\"" COMMA "," R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/cfg_true_false_pred.rast b/crates/parser/test_data/parser/inline/ok/cfg_true_false_pred.rast index e33595a93dcd..7ec4f2d59757 100644 --- a/crates/parser/test_data/parser/inline/ok/cfg_true_false_pred.rast +++ b/crates/parser/test_data/parser/inline/ok/cfg_true_false_pred.rast @@ -9,8 +9,7 @@ SOURCE_FILE CFG_ATOM TRUE_KW "true" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -21,5 +20,5 @@ SOURCE_FILE CFG_ATOM FALSE_KW "false" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/closure_binder.rast b/crates/parser/test_data/parser/inline/ok/closure_binder.rast index c96ccf7c7f1e..ff24b50a883c 100644 --- a/crates/parser/test_data/parser/inline/ok/closure_binder.rast +++ b/crates/parser/test_data/parser/inline/ok/closure_binder.rast @@ -1,17 +1,14 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT CLOSURE_EXPR FOR_BINDER @@ -21,16 +18,13 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] PARAM_LIST PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/closure_body_underscore_assignment.rast b/crates/parser/test_data/parser/inline/ok/closure_body_underscore_assignment.rast index 8970922c9779..f895512a6823 100644 --- a/crates/parser/test_data/parser/inline/ok/closure_body_underscore_assignment.rast +++ b/crates/parser/test_data/parser/inline/ok/closure_body_underscore_assignment.rast @@ -1,32 +1,25 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT CLOSURE_EXPR PARAM_LIST PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] BIN_EXPR UNDERSCORE_EXPR - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/closure_params.rast b/crates/parser/test_data/parser/inline/ok/closure_params.rast index 318eb89deaa1..b89dff8dca9c 100644 --- a/crates/parser/test_data/parser/inline/ok/closure_params.rast +++ b/crates/parser/test_data/parser/inline/ok/closure_params.rast @@ -1,26 +1,20 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CLOSURE_EXPR PARAM_LIST PIPE "|" @@ -28,27 +22,23 @@ SOURCE_FILE IDENT_PAT NAME IDENT "bar" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "baz" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Baz" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "qux" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH @@ -59,12 +49,10 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Quux" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/closure_postfix_range_method_call.rast b/crates/parser/test_data/parser/inline/ok/closure_postfix_range_method_call.rast index 555d312e3389..9a9aefce3555 100644 --- a/crates/parser/test_data/parser/inline/ok/closure_postfix_range_method_call.rast +++ b/crates/parser/test_data/parser/inline/ok/closure_postfix_range_method_call.rast @@ -1,53 +1,44 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT METHOD_CALL_EXPR CLOSURE_EXPR PARAM_LIST - PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [WHITESPACE(" ")] [] + PIPE "|" [] [WHITESPACE(" ")] RANGE_EXPR LITERAL INT_NUMBER "1" - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] DOT "." NAME_REF IDENT "method" ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT FIELD_EXPR CLOSURE_EXPR PARAM_LIST - PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [WHITESPACE(" ")] [] + PIPE "|" [] [WHITESPACE(" ")] RANGE_EXPR LITERAL INT_NUMBER "1" - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] DOT "." NAME_REF IDENT "field" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/closure_range_method_call.rast b/crates/parser/test_data/parser/inline/ok/closure_range_method_call.rast index 542711339d19..a4ad4ecacc81 100644 --- a/crates/parser/test_data/parser/inline/ok/closure_range_method_call.rast +++ b/crates/parser/test_data/parser/inline/ok/closure_range_method_call.rast @@ -1,49 +1,40 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT METHOD_CALL_EXPR CLOSURE_EXPR PARAM_LIST - PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [WHITESPACE(" ")] [] + PIPE "|" [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] DOT "." NAME_REF IDENT "method" ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT FIELD_EXPR CLOSURE_EXPR PARAM_LIST - PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [WHITESPACE(" ")] [] + PIPE "|" [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] DOT "." NAME_REF IDENT "field" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/const_arg.rast b/crates/parser/test_data/parser/inline/ok/const_arg.rast index 1e030071723b..d74c4820fe53 100644 --- a/crates/parser/test_data/parser/inline/ok/const_arg.rast +++ b/crates/parser/test_data/parser/inline/ok/const_arg.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -18,5 +15,5 @@ SOURCE_FILE LITERAL INT_NUMBER "92" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/const_arg_block.rast b/crates/parser/test_data/parser/inline/ok/const_arg_block.rast index ea8866da2770..913633e1bdf5 100644 --- a/crates/parser/test_data/parser/inline/ok/const_arg_block.rast +++ b/crates/parser/test_data/parser/inline/ok/const_arg_block.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -20,13 +17,11 @@ SOURCE_FILE L_CURLY "{" BIN_EXPR LITERAL - INT_NUMBER "90" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + INT_NUMBER "90" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" R_CURLY "}" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/const_arg_bool_literal.rast b/crates/parser/test_data/parser/inline/ok/const_arg_bool_literal.rast index aea23e463daa..9b8dde4eb6d5 100644 --- a/crates/parser/test_data/parser/inline/ok/const_arg_bool_literal.rast +++ b/crates/parser/test_data/parser/inline/ok/const_arg_bool_literal.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -18,5 +15,5 @@ SOURCE_FILE LITERAL TRUE_KW "true" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/const_arg_literal.rast b/crates/parser/test_data/parser/inline/ok/const_arg_literal.rast index 03d414e33665..5fd7d52f9ce1 100644 --- a/crates/parser/test_data/parser/inline/ok/const_arg_literal.rast +++ b/crates/parser/test_data/parser/inline/ok/const_arg_literal.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -17,11 +14,10 @@ SOURCE_FILE CONST_ARG LITERAL STRING "\"hello\"" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] CONST_ARG LITERAL INT_NUMBER "0xdeadbeef" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/const_arg_negative_number.rast b/crates/parser/test_data/parser/inline/ok/const_arg_negative_number.rast index e504badbd3db..9cb1a682e76c 100644 --- a/crates/parser/test_data/parser/inline/ok/const_arg_negative_number.rast +++ b/crates/parser/test_data/parser/inline/ok/const_arg_negative_number.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -20,5 +17,5 @@ SOURCE_FILE LITERAL INT_NUMBER "92" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/const_block_pat.rast b/crates/parser/test_data/parser/inline/ok/const_block_pat.rast index 593867a7b12b..74754640ff90 100644 --- a/crates/parser/test_data/parser/inline/ok/const_block_pat.rast +++ b/crates/parser/test_data/parser/inline/ok/const_block_pat.rast @@ -1,49 +1,36 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] CONST_BLOCK_PAT - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "15" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - EQ "=" - WHITESPACE " " + INT_NUMBER "15" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] CONST_BLOCK_PAT - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT CALL_EXPR PATH_EXPR @@ -54,8 +41,7 @@ SOURCE_FILE ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -64,136 +50,96 @@ SOURCE_FILE IDENT "bar" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL - INT_NUMBER "42" - WHITESPACE " " + INT_NUMBER "42" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM RANGE_PAT CONST_BLOCK_PAT - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [WHITESPACE(" ")] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "0" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - DOT2 ".." - WHITESPACE " " + INT_NUMBER "0" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + DOT2 ".." [] [WHITESPACE(" ")] CONST_BLOCK_PAT - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "1" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM RANGE_PAT - DOT2 ".." - WHITESPACE " " + DOT2 ".." [WHITESPACE(" ")] [WHITESPACE(" ")] CONST_BLOCK_PAT - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "0" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + INT_NUMBER "0" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM RANGE_PAT CONST_BLOCK_PAT - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [WHITESPACE(" ")] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "2" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - DOT2 ".." - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + INT_NUMBER "2" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + DOT2 ".." [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_PAT L_PAREN "(" CONST_BLOCK_PAT - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] R_CURLY "}" COMMA "," - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/const_closure.rast b/crates/parser/test_data/parser/inline/ok/const_closure.rast index 06442a1d0f1f..aab88175e916 100644 --- a/crates/parser/test_data/parser/inline/ok/const_closure.rast +++ b/crates/parser/test_data/parser/inline/ok/const_closure.rast @@ -1,42 +1,31 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "cl" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "cl" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CLOSURE_EXPR - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] PARAM_LIST PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] BIN_EXPR UNDERSCORE_EXPR - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/const_item.rast b/crates/parser/test_data/parser/inline/ok/const_item.rast index 909983c9a2a2..4ec082b47485 100644 --- a/crates/parser/test_data/parser/inline/ok/const_item.rast +++ b/crates/parser/test_data/parser/inline/ok/const_item.rast @@ -1,20 +1,16 @@ SOURCE_FILE CONST - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] NAME IDENT "C" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u32" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "u32" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "92" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/const_param.rast b/crates/parser/test_data/parser/inline/ok/const_param.rast index 24595a1a185b..5b67f83c80cc 100644 --- a/crates/parser/test_data/parser/inline/ok/const_param.rast +++ b/crates/parser/test_data/parser/inline/ok/const_param.rast @@ -1,23 +1,20 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" GENERIC_PARAM_LIST L_ANGLE "<" CONST_PARAM - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] NAME IDENT "N" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u32" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/const_param_default_expression.rast b/crates/parser/test_data/parser/inline/ok/const_param_default_expression.rast index d6501137498a..6b8993e08730 100644 --- a/crates/parser/test_data/parser/inline/ok/const_param_default_expression.rast +++ b/crates/parser/test_data/parser/inline/ok/const_param_default_expression.rast @@ -1,35 +1,28 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "A" GENERIC_PARAM_LIST L_ANGLE "<" CONST_PARAM - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] NAME IDENT "N" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "i32" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CONST_ARG BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "1" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] R_CURLY "}" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/const_param_default_literal.rast b/crates/parser/test_data/parser/inline/ok/const_param_default_literal.rast index 6de10353bf06..91383f62299f 100644 --- a/crates/parser/test_data/parser/inline/ok/const_param_default_literal.rast +++ b/crates/parser/test_data/parser/inline/ok/const_param_default_literal.rast @@ -1,31 +1,26 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "A" GENERIC_PARAM_LIST L_ANGLE "<" CONST_PARAM - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] NAME IDENT "N" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "i32" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CONST_ARG PREFIX_EXPR MINUS "-" LITERAL INT_NUMBER "1" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/const_param_default_path.rast b/crates/parser/test_data/parser/inline/ok/const_param_default_path.rast index 3f5fb47d2875..2aa0aab1d572 100644 --- a/crates/parser/test_data/parser/inline/ok/const_param_default_path.rast +++ b/crates/parser/test_data/parser/inline/ok/const_param_default_path.rast @@ -1,26 +1,21 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "A" GENERIC_PARAM_LIST L_ANGLE "<" CONST_PARAM - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] NAME IDENT "N" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "i32" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CONST_ARG PATH_EXPR PATH @@ -33,5 +28,5 @@ SOURCE_FILE NAME_REF IDENT "MAX" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/const_trait_bound.rast b/crates/parser/test_data/parser/inline/ok/const_trait_bound.rast index 646873881bcb..04ea58e1e8b1 100644 --- a/crates/parser/test_data/parser/inline/ok/const_trait_bound.rast +++ b/crates/parser/test_data/parser/inline/ok/const_trait_bound.rast @@ -1,9 +1,7 @@ SOURCE_FILE FN - CONST_KW "const" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST @@ -11,24 +9,20 @@ SOURCE_FILE PARAM WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] IMPL_TRAIT_TYPE - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Trait" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/const_where_clause.rast b/crates/parser/test_data/parser/inline/ok/const_where_clause.rast index 12148f6afe4b..c549b4000fb8 100644 --- a/crates/parser/test_data/parser/inline/ok/const_where_clause.rast +++ b/crates/parser/test_data/parser/inline/ok/const_where_clause.rast @@ -1,7 +1,6 @@ SOURCE_FILE CONST - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] NAME IDENT "C" GENERIC_PARAM_LIST @@ -10,30 +9,24 @@ SOURCE_FILE NAME IDENT "i32" R_ANGLE ">" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u32" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "u32" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "0" - WHITESPACE "\n" + INT_NUMBER "0" [] [NEWLINE("\n")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE " " + WHERE_KW "where" [] [WHITESPACE(" ")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -41,41 +34,32 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Copy" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TRAIT - TRAIT_KW "trait" - WHITESPACE " " + TRAIT_KW "trait" [] [WHITESPACE(" ")] NAME - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] CONST - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "C" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " + IDENT "i32" [] [WHITESPACE(" ")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE " " + WHERE_KW "where" [] [WHITESPACE(" ")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -83,7 +67,6 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Copy" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/continue_expr.rast b/crates/parser/test_data/parser/inline/ok/continue_expr.rast index 5d80a57a2e49..83c434e48136 100644 --- a/crates/parser/test_data/parser/inline/ok/continue_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/continue_expr.rast @@ -1,38 +1,29 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LOOP_EXPR - LOOP_KW "loop" - WHITESPACE " " + LOOP_KW "loop" [WHITESPACE(" ")] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT CONTINUE_EXPR - CONTINUE_KW "continue" - SEMICOLON ";" - WHITESPACE "\n " + CONTINUE_KW "continue" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CONTINUE_EXPR - CONTINUE_KW "continue" - WHITESPACE " " + CONTINUE_KW "continue" [WHITESPACE(" ")] [WHITESPACE(" ")] LIFETIME LIFETIME_IDENT "'l" - SEMICOLON ";" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/crate_path.rast b/crates/parser/test_data/parser/inline/ok/crate_path.rast index f71367ae1e43..50a36fcecff3 100644 --- a/crates/parser/test_data/parser/inline/ok/crate_path.rast +++ b/crates/parser/test_data/parser/inline/ok/crate_path.rast @@ -1,7 +1,6 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -12,5 +11,5 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "foo" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/crate_visibility.rast b/crates/parser/test_data/parser/inline/ok/crate_visibility.rast index c946f19321e5..2cea2cd72db7 100644 --- a/crates/parser/test_data/parser/inline/ok/crate_visibility.rast +++ b/crates/parser/test_data/parser/inline/ok/crate_visibility.rast @@ -8,14 +8,11 @@ SOURCE_FILE PATH_SEGMENT NAME_REF CRATE_KW "crate" - R_PAREN ")" - WHITESPACE " " - STRUCT_KW "struct" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT VISIBILITY PUB_KW "pub" @@ -25,14 +22,11 @@ SOURCE_FILE PATH_SEGMENT NAME_REF SELF_KW "self" - R_PAREN ")" - WHITESPACE " " - STRUCT_KW "struct" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT VISIBILITY PUB_KW "pub" @@ -42,11 +36,9 @@ SOURCE_FILE PATH_SEGMENT NAME_REF SUPER_KW "super" - R_PAREN ")" - WHITESPACE " " - STRUCT_KW "struct" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/crate_visibility_in.rast b/crates/parser/test_data/parser/inline/ok/crate_visibility_in.rast index 1a551ea2212f..b228cf03745e 100644 --- a/crates/parser/test_data/parser/inline/ok/crate_visibility_in.rast +++ b/crates/parser/test_data/parser/inline/ok/crate_visibility_in.rast @@ -4,8 +4,7 @@ SOURCE_FILE PUB_KW "pub" VISIBILITY_INNER L_PAREN "(" - IN_KW "in" - WHITESPACE " " + IN_KW "in" [] [WHITESPACE(" ")] PATH PATH PATH_SEGMENT @@ -15,30 +14,24 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "A" - R_PAREN ")" - WHITESPACE " " - STRUCT_KW "struct" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT VISIBILITY PUB_KW "pub" VISIBILITY_INNER L_PAREN "(" - IN_KW "in" - WHITESPACE " " + IN_KW "in" [] [WHITESPACE(" ")] PATH PATH_SEGMENT NAME_REF CRATE_KW "crate" - R_PAREN ")" - WHITESPACE " " - STRUCT_KW "struct" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/default_async_fn.rast b/crates/parser/test_data/parser/inline/ok/default_async_fn.rast index 06b37e23938e..b52ebdf75add 100644 --- a/crates/parser/test_data/parser/inline/ok/default_async_fn.rast +++ b/crates/parser/test_data/parser/inline/ok/default_async_fn.rast @@ -1,41 +1,31 @@ SOURCE_FILE IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "T" - WHITESPACE " " - FOR_KW "for" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + FOR_KW "for" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - DEFAULT_KW "default" - WHITESPACE " " - ASYNC_KW "async" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + DEFAULT_KW "default" [WHITESPACE(" ")] [WHITESPACE(" ")] + ASYNC_KW "async" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/default_async_unsafe_fn.rast b/crates/parser/test_data/parser/inline/ok/default_async_unsafe_fn.rast index 7c2f7b34c74f..48070ffd3c97 100644 --- a/crates/parser/test_data/parser/inline/ok/default_async_unsafe_fn.rast +++ b/crates/parser/test_data/parser/inline/ok/default_async_unsafe_fn.rast @@ -1,43 +1,32 @@ SOURCE_FILE IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "T" - WHITESPACE " " - FOR_KW "for" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + FOR_KW "for" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - DEFAULT_KW "default" - WHITESPACE " " - ASYNC_KW "async" - WHITESPACE " " - UNSAFE_KW "unsafe" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + DEFAULT_KW "default" [WHITESPACE(" ")] [WHITESPACE(" ")] + ASYNC_KW "async" [] [WHITESPACE(" ")] + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/default_item.rast b/crates/parser/test_data/parser/inline/ok/default_item.rast index 7a8e8cf1dd28..b6b16d5fc4a5 100644 --- a/crates/parser/test_data/parser/inline/ok/default_item.rast +++ b/crates/parser/test_data/parser/inline/ok/default_item.rast @@ -1,24 +1,19 @@ SOURCE_FILE IMPL - DEFAULT_KW "default" - WHITESPACE " " - IMPL_KW "impl" - WHITESPACE " " + DEFAULT_KW "default" [] [WHITESPACE(" ")] + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "T" - WHITESPACE " " - FOR_KW "for" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + FOR_KW "for" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/default_unsafe_item.rast b/crates/parser/test_data/parser/inline/ok/default_unsafe_item.rast index b180d0b72cc9..69ad9402e147 100644 --- a/crates/parser/test_data/parser/inline/ok/default_unsafe_item.rast +++ b/crates/parser/test_data/parser/inline/ok/default_unsafe_item.rast @@ -1,45 +1,33 @@ SOURCE_FILE IMPL - DEFAULT_KW "default" - WHITESPACE " " - UNSAFE_KW "unsafe" - WHITESPACE " " - IMPL_KW "impl" - WHITESPACE " " + DEFAULT_KW "default" [] [WHITESPACE(" ")] + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "T" - WHITESPACE " " - FOR_KW "for" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + FOR_KW "for" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - DEFAULT_KW "default" - WHITESPACE " " - UNSAFE_KW "unsafe" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + DEFAULT_KW "default" [WHITESPACE(" ")] [WHITESPACE(" ")] + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/deref_pat.rast b/crates/parser/test_data/parser/inline/ok/deref_pat.rast index ab4073c0818f..1e0fc47629d2 100644 --- a/crates/parser/test_data/parser/inline/ok/deref_pat.rast +++ b/crates/parser/test_data/parser/inline/ok/deref_pat.rast @@ -1,36 +1,27 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] DEREF_PAT - BUILTIN_KW "builtin" - WHITESPACE " " - POUND "#" - WHITESPACE " " + BUILTIN_KW "builtin" [] [WHITESPACE(" ")] + POUND "#" [] [WHITESPACE(" ")] DEREF_KW "deref" L_PAREN "(" WILDCARD_PAT UNDERSCORE "_" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/destructuring_assignment_struct_rest_pattern.rast b/crates/parser/test_data/parser/inline/ok/destructuring_assignment_struct_rest_pattern.rast index fb8aa5accb5a..59abb199355c 100644 --- a/crates/parser/test_data/parser/inline/ok/destructuring_assignment_struct_rest_pattern.rast +++ b/crates/parser/test_data/parser/inline/ok/destructuring_assignment_struct_rest_pattern.rast @@ -1,44 +1,34 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " - DOT2 ".." - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - EQ "=" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] + DOT2 ".." [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/destructuring_assignment_wildcard_pat.rast b/crates/parser/test_data/parser/inline/ok/destructuring_assignment_wildcard_pat.rast index 5f53d34510e7..d14b1d114d13 100644 --- a/crates/parser/test_data/parser/inline/ok/destructuring_assignment_wildcard_pat.rast +++ b/crates/parser/test_data/parser/inline/ok/destructuring_assignment_wildcard_pat.rast @@ -1,28 +1,22 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR UNDERSCORE_EXPR - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR CALL_EXPR @@ -30,21 +24,18 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "Some" + IDENT "Some" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" UNDERSCORE_EXPR UNDERSCORE "_" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "None" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/dot_dot_pat.rast b/crates/parser/test_data/parser/inline/ok/dot_dot_pat.rast index 4d4011e6b4aa..3c870cd77e64 100644 --- a/crates/parser/test_data/parser/inline/ok/dot_dot_pat.rast +++ b/crates/parser/test_data/parser/inline/ok/dot_dot_pat.rast @@ -1,82 +1,58 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] REST_PAT - DOT2 ".." - WHITESPACE " " - EQ "=" - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " - COMMENT "//" - WHITESPACE "\n " - COMMENT "// Tuples" - WHITESPACE "\n " - COMMENT "//" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" "), COMMENT("//"), NEWLINE("\n"), WHITESPACE(" "), COMMENT("// Tuples"), NEWLINE("\n"), WHITESPACE(" "), COMMENT("//"), NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_PAT L_PAREN "(" IDENT_PAT NAME IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_PAT L_PAREN "(" IDENT_PAT NAME IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." COMMA "," - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_STRUCT_PAT PATH PATH_SEGMENT @@ -86,22 +62,17 @@ SOURCE_FILE IDENT_PAT NAME IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_STRUCT_PAT PATH PATH_SEGMENT @@ -111,43 +82,33 @@ SOURCE_FILE IDENT_PAT NAME IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." COMMA "," - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_PAT L_PAREN "(" REST_PAT DOT2 ".." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_STRUCT_PAT PATH PATH_SEGMENT @@ -156,47 +117,36 @@ SOURCE_FILE L_PAREN "(" REST_PAT DOT2 ".." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_PAT L_PAREN "(" REST_PAT DOT2 ".." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_STRUCT_PAT PATH PATH_SEGMENT @@ -205,252 +155,187 @@ SOURCE_FILE L_PAREN "(" REST_PAT DOT2 ".." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " - COMMENT "//" - WHITESPACE "\n " - COMMENT "// Slices" - WHITESPACE "\n " - COMMENT "//" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" "), COMMENT("//"), NEWLINE("\n"), WHITESPACE(" "), COMMENT("// Slices"), NEWLINE("\n"), WHITESPACE(" "), COMMENT("//"), NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] SLICE_PAT L_BRACK "[" REST_PAT DOT2 ".." - R_BRACK "]" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] SLICE_PAT L_BRACK "[" IDENT_PAT NAME IDENT "head" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - R_BRACK "]" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] SLICE_PAT L_BRACK "[" IDENT_PAT NAME IDENT "head" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "tail" - WHITESPACE " " - AT "@" - WHITESPACE " " + IDENT "tail" [] [WHITESPACE(" ")] + AT "@" [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - R_BRACK "]" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] SLICE_PAT L_BRACK "[" IDENT_PAT NAME IDENT "head" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "cons" - R_BRACK "]" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] SLICE_PAT L_BRACK "[" IDENT_PAT NAME IDENT "head" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "mid" - WHITESPACE " " - AT "@" - WHITESPACE " " + IDENT "mid" [] [WHITESPACE(" ")] + AT "@" [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "cons" - R_BRACK "]" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] SLICE_PAT L_BRACK "[" IDENT_PAT NAME IDENT "head" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "cons" - R_BRACK "]" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] SLICE_PAT L_BRACK "[" IDENT_PAT NAME IDENT "head" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "mid" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "tail" - WHITESPACE " " - AT "@" - WHITESPACE " " + IDENT "tail" [] [WHITESPACE(" ")] + AT "@" [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - R_BRACK "]" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] SLICE_PAT L_BRACK "[" IDENT_PAT NAME IDENT "head" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "mid" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "cons" - R_BRACK "]" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/dyn_trait_type.rast b/crates/parser/test_data/parser/inline/ok/dyn_trait_type.rast index e37d43aac6c2..5ffd2c48e673 100644 --- a/crates/parser/test_data/parser/inline/ok/dyn_trait_type.rast +++ b/crates/parser/test_data/parser/inline/ok/dyn_trait_type.rast @@ -1,15 +1,11 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "A" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "A" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] DYN_TRAIT_TYPE - DYN_KW "dyn" - WHITESPACE " " + DYN_KW "dyn" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -34,12 +30,10 @@ SOURCE_FILE LIFETIME LIFETIME_IDENT "'a" R_ANGLE ">" - R_ANGLE ">" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND LIFETIME LIFETIME_IDENT "'a" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/dyn_trait_type_weak.rast b/crates/parser/test_data/parser/inline/ok/dyn_trait_type_weak.rast index 6578809cb0e0..d1008380f88e 100644 --- a/crates/parser/test_data/parser/inline/ok/dyn_trait_type_weak.rast +++ b/crates/parser/test_data/parser/inline/ok/dyn_trait_type_weak.rast @@ -1,17 +1,11 @@ SOURCE_FILE TYPE_ALIAS - COMMENT "// 2015" - WHITESPACE "\n" - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [COMMENT("// 2015"), NEWLINE("\n")] [WHITESPACE(" ")] NAME - IDENT "DynPlain" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "DynPlain" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] DYN_TRAIT_TYPE - DYN_KW "dyn" - WHITESPACE " " + DYN_KW "dyn" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -19,21 +13,16 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Path" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "DynRef" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "DynRef" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_TYPE AMP "&" DYN_TRAIT_TYPE - DYN_KW "dyn" - WHITESPACE " " + DYN_KW "dyn" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -41,45 +30,33 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Path" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "DynLt" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "DynLt" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] DYN_TRAIT_TYPE - DYN_KW "dyn" - WHITESPACE " " + DYN_KW "dyn" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Path" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "DynQuestion" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "DynQuestion" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] DYN_TRAIT_TYPE - DYN_KW "dyn" - WHITESPACE " " + DYN_KW "dyn" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND QUESTION "?" @@ -88,19 +65,14 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Path" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "DynFor" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "DynFor" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] DYN_TRAIT_TYPE - DYN_KW "dyn" - WHITESPACE " " + DYN_KW "dyn" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND FOR_BINDER @@ -110,23 +82,18 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Path" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "DynParen" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "DynParen" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] DYN_TRAIT_TYPE DYN_KW "dyn" TYPE_BOUND_LIST @@ -138,16 +105,12 @@ SOURCE_FILE NAME_REF IDENT "Path" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "Path" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Path" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH @@ -158,16 +121,12 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Path" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "Generic" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Generic" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -182,5 +141,5 @@ SOURCE_FILE NAME_REF IDENT "Path" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/edition_2015_dyn_prefix_inside_generic_arg.rast b/crates/parser/test_data/parser/inline/ok/edition_2015_dyn_prefix_inside_generic_arg.rast index 24e671b34388..fcf82e0a24a6 100644 --- a/crates/parser/test_data/parser/inline/ok/edition_2015_dyn_prefix_inside_generic_arg.rast +++ b/crates/parser/test_data/parser/inline/ok/edition_2015_dyn_prefix_inside_generic_arg.rast @@ -1,14 +1,9 @@ SOURCE_FILE TYPE_ALIAS - COMMENT "// 2015" - WHITESPACE "\n" - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [COMMENT("// 2015"), NEWLINE("\n")] [WHITESPACE(" ")] NAME - IDENT "A" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "A" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -18,8 +13,7 @@ SOURCE_FILE L_ANGLE "<" TYPE_ARG DYN_TRAIT_TYPE - DYN_KW "dyn" - WHITESPACE " " + DYN_KW "dyn" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -28,5 +22,5 @@ SOURCE_FILE NAME_REF IDENT "T" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/effect_blocks.rast b/crates/parser/test_data/parser/inline/ok/effect_blocks.rast index f14080c90ea4..6513c9772ecd 100644 --- a/crates/parser/test_data/parser/inline/ok/effect_blocks.rast +++ b/crates/parser/test_data/parser/inline/ok/effect_blocks.rast @@ -1,95 +1,67 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] BLOCK_EXPR - UNSAFE_KW "unsafe" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] STMT_LIST - L_CURLY "{" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] BLOCK_EXPR - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] STMT_LIST - L_CURLY "{" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] BLOCK_EXPR - ASYNC_KW "async" - WHITESPACE " " + ASYNC_KW "async" [] [WHITESPACE(" ")] STMT_LIST - L_CURLY "{" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] BLOCK_EXPR - ASYNC_KW "async" - WHITESPACE " " - MOVE_KW "move" - WHITESPACE " " + ASYNC_KW "async" [] [WHITESPACE(" ")] + MOVE_KW "move" [] [WHITESPACE(" ")] STMT_LIST - L_CURLY "{" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/exclusive_range_pat.rast b/crates/parser/test_data/parser/inline/ok/exclusive_range_pat.rast index fd2c422d0d19..5f584fbdd011 100644 --- a/crates/parser/test_data/parser/inline/ok/exclusive_range_pat.rast +++ b/crates/parser/test_data/parser/inline/ok/exclusive_range_pat.rast @@ -1,58 +1,45 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL - INT_NUMBER "42" - WHITESPACE " " + INT_NUMBER "42" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM RANGE_PAT - DOT2 ".." + DOT2 ".." [WHITESPACE(" ")] [] LITERAL_PAT LITERAL - INT_NUMBER "0" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + INT_NUMBER "0" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] MATCH_ARM RANGE_PAT LITERAL_PAT LITERAL - INT_NUMBER "1" + INT_NUMBER "1" [WHITESPACE(" ")] [] DOT2 ".." LITERAL_PAT LITERAL - INT_NUMBER "2" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + INT_NUMBER "2" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/expr_literals.rast b/crates/parser/test_data/parser/inline/ok/expr_literals.rast index fe73d9dfe4a7..a06df470a87c 100644 --- a/crates/parser/test_data/parser/inline/ok/expr_literals.rast +++ b/crates/parser/test_data/parser/inline/ok/expr_literals.rast @@ -1,160 +1,109 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL TRUE_KW "true" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL FALSE_KW "false" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL FLOAT_NUMBER "2.0" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL BYTE "b'a'" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL CHAR "'b'" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL STRING "\"c\"" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL STRING "r\"d\"" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL BYTE_STRING "b\"e\"" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL BYTE_STRING "br\"f\"" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL C_STRING "c\"g\"" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL C_STRING "cr\"h\"" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/expression_after_block.rast b/crates/parser/test_data/parser/inline/ok/expression_after_block.rast index 553ac356d73c..26e8a137b1e2 100644 --- a/crates/parser/test_data/parser/inline/ok/expression_after_block.rast +++ b/crates/parser/test_data/parser/inline/ok/expression_after_block.rast @@ -1,28 +1,21 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] NAME - IDENT "p" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "p" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] RECORD_EXPR PATH PATH_SEGMENT @@ -33,19 +26,17 @@ SOURCE_FILE RECORD_EXPR_FIELD NAME_REF IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "5" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR FIELD_EXPR BLOCK_EXPR STMT_LIST - L_CURLY "{" + L_CURLY "{" [WHITESPACE(" ")] [] PATH_EXPR PATH PATH_SEGMENT @@ -54,13 +45,10 @@ SOURCE_FILE R_CURLY "}" DOT "." NAME_REF - IDENT "x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "x" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "10" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/extern_block.rast b/crates/parser/test_data/parser/inline/ok/extern_block.rast index 7a3cd6a0dfdb..87f1100075bf 100644 --- a/crates/parser/test_data/parser/inline/ok/extern_block.rast +++ b/crates/parser/test_data/parser/inline/ok/extern_block.rast @@ -1,21 +1,16 @@ SOURCE_FILE EXTERN_BLOCK - UNSAFE_KW "unsafe" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] ABI - EXTERN_KW "extern" - WHITESPACE " " - STRING "\"C\"" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + STRING "\"C\"" [] [WHITESPACE(" ")] EXTERN_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] EXTERN_BLOCK ABI - EXTERN_KW "extern" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] EXTERN_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/extern_crate.rast b/crates/parser/test_data/parser/inline/ok/extern_crate.rast index aa555ed2293b..222df1cbf4bb 100644 --- a/crates/parser/test_data/parser/inline/ok/extern_crate.rast +++ b/crates/parser/test_data/parser/inline/ok/extern_crate.rast @@ -1,19 +1,14 @@ SOURCE_FILE EXTERN_CRATE - EXTERN_KW "extern" - WHITESPACE " " - CRATE_KW "crate" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + CRATE_KW "crate" [] [WHITESPACE(" ")] NAME_REF IDENT "foo" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] EXTERN_CRATE - EXTERN_KW "extern" - WHITESPACE " " - CRATE_KW "crate" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + CRATE_KW "crate" [] [WHITESPACE(" ")] NAME_REF SELF_KW "self" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/extern_crate_rename.rast b/crates/parser/test_data/parser/inline/ok/extern_crate_rename.rast index 5f0a5b5bb051..b45db9dfa3d1 100644 --- a/crates/parser/test_data/parser/inline/ok/extern_crate_rename.rast +++ b/crates/parser/test_data/parser/inline/ok/extern_crate_rename.rast @@ -1,31 +1,22 @@ SOURCE_FILE EXTERN_CRATE - EXTERN_KW "extern" - WHITESPACE " " - CRATE_KW "crate" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + CRATE_KW "crate" [] [WHITESPACE(" ")] NAME_REF - IDENT "foo" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] RENAME - AS_KW "as" - WHITESPACE " " + AS_KW "as" [] [WHITESPACE(" ")] NAME IDENT "bar" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] EXTERN_CRATE - EXTERN_KW "extern" - WHITESPACE " " - CRATE_KW "crate" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + CRATE_KW "crate" [] [WHITESPACE(" ")] NAME_REF - SELF_KW "self" - WHITESPACE " " + SELF_KW "self" [] [WHITESPACE(" ")] RENAME - AS_KW "as" - WHITESPACE " " + AS_KW "as" [] [WHITESPACE(" ")] NAME IDENT "bar" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/field_expr.rast b/crates/parser/test_data/parser/inline/ok/field_expr.rast index 3bac226d3430..416bb4c88867 100644 --- a/crates/parser/test_data/parser/inline/ok/field_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/field_expr.rast @@ -1,53 +1,47 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT FIELD_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] DOT "." NAME_REF SELF_KW "self" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT FIELD_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] DOT "." NAME_REF SELF_TYPE_KW "Self" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT FIELD_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] DOT "." NAME_REF IDENT "foo" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT FIELD_EXPR FIELD_EXPR @@ -55,15 +49,14 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] DOT "." NAME_REF INT_NUMBER "0" DOT "." NAME_REF IDENT "bar" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT FIELD_EXPR FIELD_EXPR @@ -71,15 +64,14 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] DOT "." NAME_REF INT_NUMBER "0" DOT "." NAME_REF INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT FIELD_EXPR FIELD_EXPR @@ -87,16 +79,14 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] DOT "." NAME_REF INT_NUMBER "0" - DOT "." - WHITESPACE " " + DOT "." [] [WHITESPACE(" ")] NAME_REF IDENT "bar" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR FIELD_EXPR @@ -104,14 +94,13 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] DOT "." NAME_REF INT_NUMBER "0" ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/fn_.rast b/crates/parser/test_data/parser/inline/ok/fn_.rast index a88b3393f295..3be06e678806 100644 --- a/crates/parser/test_data/parser/inline/ok/fn_.rast +++ b/crates/parser/test_data/parser/inline/ok/fn_.rast @@ -1,15 +1,13 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/fn_decl.rast b/crates/parser/test_data/parser/inline/ok/fn_decl.rast index f7fac807f496..fd080c8e6373 100644 --- a/crates/parser/test_data/parser/inline/ok/fn_decl.rast +++ b/crates/parser/test_data/parser/inline/ok/fn_decl.rast @@ -1,22 +1,17 @@ SOURCE_FILE TRAIT - TRAIT_KW "trait" - WHITESPACE " " + TRAIT_KW "trait" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/fn_def_param.rast b/crates/parser/test_data/parser/inline/ok/fn_def_param.rast index ce425a1afde6..4fc739fb271f 100644 --- a/crates/parser/test_data/parser/inline/ok/fn_def_param.rast +++ b/crates/parser/test_data/parser/inline/ok/fn_def_param.rast @@ -1,29 +1,25 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" PARAM DOT3 "..." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM TUPLE_PAT L_PAREN "(" IDENT_PAT NAME IDENT "x" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "y" R_PAREN ")" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" PATH_TYPE @@ -31,18 +27,16 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "i32" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" R_PAREN ")" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/fn_pointer_param_ident_path.rast b/crates/parser/test_data/parser/inline/ok/fn_pointer_param_ident_path.rast index ee8465e6ca9d..c932f080e435 100644 --- a/crates/parser/test_data/parser/inline/ok/fn_pointer_param_ident_path.rast +++ b/crates/parser/test_data/parser/inline/ok/fn_pointer_param_ident_path.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "Foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FN_PTR_TYPE FN_KW "fn" PARAM_LIST @@ -23,16 +20,12 @@ SOURCE_FILE NAME_REF IDENT "Baz" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "Qux" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Qux" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FN_PTR_TYPE FN_KW "fn" PARAM_LIST @@ -41,8 +34,7 @@ SOURCE_FILE IDENT_PAT NAME IDENT "baz" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH @@ -54,5 +46,5 @@ SOURCE_FILE NAME_REF IDENT "Baz" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/fn_pointer_type.rast b/crates/parser/test_data/parser/inline/ok/fn_pointer_type.rast index 608b0be160a6..b8c124651642 100644 --- a/crates/parser/test_data/parser/inline/ok/fn_pointer_type.rast +++ b/crates/parser/test_data/parser/inline/ok/fn_pointer_type.rast @@ -1,98 +1,70 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "A" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "A" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FN_PTR_TYPE FN_KW "fn" PARAM_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "B" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "B" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FN_PTR_TYPE - UNSAFE_KW "unsafe" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] FN_KW "fn" PARAM_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "C" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "C" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FN_PTR_TYPE - UNSAFE_KW "unsafe" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] ABI - EXTERN_KW "extern" - WHITESPACE " " - STRING "\"C\"" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + STRING "\"C\"" [] [WHITESPACE(" ")] FN_KW "fn" PARAM_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "D" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "D" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FN_PTR_TYPE ABI - EXTERN_KW "extern" - WHITESPACE " " - STRING "\"C\"" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + STRING "\"C\"" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] PARAM_LIST - L_PAREN "(" - WHITESPACE " " + L_PAREN "(" [] [WHITESPACE(" ")] PARAM PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u8" - WHITESPACE " " - COMMA "," - WHITESPACE " " + IDENT "u8" [] [WHITESPACE(" ")] + COMMA "," [] [WHITESPACE(" ")] PARAM - DOT3 "..." - WHITESPACE " " - R_PAREN ")" - WHITESPACE " " + DOT3 "..." [] [WHITESPACE(" ")] + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u8" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/fn_pointer_type_with_ret.rast b/crates/parser/test_data/parser/inline/ok/fn_pointer_type_with_ret.rast index 372c867ae6d8..814a998ca789 100644 --- a/crates/parser/test_data/parser/inline/ok/fn_pointer_type_with_ret.rast +++ b/crates/parser/test_data/parser/inline/ok/fn_pointer_type_with_ret.rast @@ -1,23 +1,18 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "F" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "F" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FN_PTR_TYPE FN_KW "fn" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/fn_pointer_unnamed_arg.rast b/crates/parser/test_data/parser/inline/ok/fn_pointer_unnamed_arg.rast index 8a525c6e05e1..a7e94d7bea24 100644 --- a/crates/parser/test_data/parser/inline/ok/fn_pointer_unnamed_arg.rast +++ b/crates/parser/test_data/parser/inline/ok/fn_pointer_unnamed_arg.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "Foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FN_PTR_TYPE FN_KW "fn" PARAM_LIST @@ -14,13 +11,12 @@ SOURCE_FILE PARAM WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "bar" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/for_binder_bound.rast b/crates/parser/test_data/parser/inline/ok/for_binder_bound.rast index 17dbbf30a7bc..2366d4a5f7cf 100644 --- a/crates/parser/test_data/parser/inline/ok/for_binder_bound.rast +++ b/crates/parser/test_data/parser/inline/ok/for_binder_bound.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" GENERIC_PARAM_LIST @@ -9,8 +8,7 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND FOR_BINDER @@ -20,14 +18,11 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] L_BRACK "[" CONST_KW "const" - R_BRACK "]" - WHITESPACE " " - ASYNC_KW "async" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + ASYNC_KW "async" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -36,10 +31,9 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/for_expr.rast b/crates/parser/test_data/parser/inline/ok/for_expr.rast index 6bc3c0fb0577..81a986eb6587 100644 --- a/crates/parser/test_data/parser/inline/ok/for_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/for_expr.rast @@ -1,36 +1,28 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT FOR_EXPR - FOR_KW "for" - WHITESPACE " " + FOR_KW "for" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "x" - WHITESPACE " " - IN_KW "in" - WHITESPACE " " + IDENT "x" [] [WHITESPACE(" ")] + IN_KW "in" [] [WHITESPACE(" ")] ARRAY_EXPR L_BRACK "[" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/for_range_from.rast b/crates/parser/test_data/parser/inline/ok/for_range_from.rast index 90cf3101c137..1099e4f65503 100644 --- a/crates/parser/test_data/parser/inline/ok/for_range_from.rast +++ b/crates/parser/test_data/parser/inline/ok/for_range_from.rast @@ -1,42 +1,31 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FOR_EXPR - FOR_KW "for" - WHITESPACE " " + FOR_KW "for" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "x" - WHITESPACE " " - IN_KW "in" - WHITESPACE " " + IDENT "x" [] [WHITESPACE(" ")] + IN_KW "in" [] [WHITESPACE(" ")] RANGE_EXPR LITERAL - INT_NUMBER "0" - WHITESPACE " " - DOT2 ".." - WHITESPACE " " + INT_NUMBER "0" [] [WHITESPACE(" ")] + DOT2 ".." [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BREAK_EXPR - BREAK_KW "break" - SEMICOLON ";" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + BREAK_KW "break" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/for_type.rast b/crates/parser/test_data/parser/inline/ok/for_type.rast index 58623058cae1..45a2a17126e0 100644 --- a/crates/parser/test_data/parser/inline/ok/for_type.rast +++ b/crates/parser/test_data/parser/inline/ok/for_type.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "A" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "A" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FOR_TYPE FOR_BINDER FOR_KW "for" @@ -15,30 +12,23 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] FN_PTR_TYPE FN_KW "fn" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "B" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "B" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FOR_TYPE FOR_BINDER FOR_KW "for" @@ -47,16 +37,12 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] FN_PTR_TYPE - UNSAFE_KW "unsafe" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] ABI - EXTERN_KW "extern" - WHITESPACE " " - STRING "\"C\"" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + STRING "\"C\"" [] [WHITESPACE(" ")] FN_KW "fn" PARAM_LIST L_PAREN "(" @@ -64,29 +50,22 @@ SOURCE_FILE REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "Obj" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Obj" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FOR_TYPE FOR_BINDER FOR_KW "for" @@ -95,8 +74,7 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -108,13 +86,12 @@ SOURCE_FILE REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/format_args_named_arg_keyword.rast b/crates/parser/test_data/parser/inline/ok/format_args_named_arg_keyword.rast index 50b9208b3e54..e6014859b953 100644 --- a/crates/parser/test_data/parser/inline/ok/format_args_named_arg_keyword.rast +++ b/crates/parser/test_data/parser/inline/ok/format_args_named_arg_keyword.rast @@ -1,27 +1,23 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT FORMAT_ARGS_EXPR - BUILTIN_KW "builtin" + BUILTIN_KW "builtin" [WHITESPACE(" ")] [] POUND "#" FORMAT_ARGS_KW "format_args" L_PAREN "(" LITERAL STRING "\"{type}\"" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] FORMAT_ARGS_ARG NAME IDENT "type" @@ -29,7 +25,6 @@ SOURCE_FILE LITERAL INT_NUMBER "1" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/frontmatter.rast b/crates/parser/test_data/parser/inline/ok/frontmatter.rast index bad895929316..190b7a3ec541 100644 --- a/crates/parser/test_data/parser/inline/ok/frontmatter.rast +++ b/crates/parser/test_data/parser/inline/ok/frontmatter.rast @@ -1,18 +1,15 @@ SOURCE_FILE SHEBANG "#!/usr/bin/env cargo\n" - FRONTMATTER "\n---\n[dependencies]\nclap = { version = \"4.2\", features = [\"derive\"] }\n---\n" - WHITESPACE "\n" + FRONTMATTER "\n---\n[dependencies]\nclap = { version = \"4.2\", features = [\"derive\"] }\n---\n" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/full_range_expr.rast b/crates/parser/test_data/parser/inline/ok/full_range_expr.rast index 9ffc07630419..ded9a8eb730e 100644 --- a/crates/parser/test_data/parser/inline/ok/full_range_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/full_range_expr.rast @@ -1,17 +1,14 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT INDEX_EXPR PATH_EXPR @@ -23,7 +20,6 @@ SOURCE_FILE RANGE_EXPR DOT2 ".." R_BRACK "]" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/function_ret_type.rast b/crates/parser/test_data/parser/inline/ok/function_ret_type.rast index 6687c843fbbe..06e4b38deb73 100644 --- a/crates/parser/test_data/parser/inline/ok/function_ret_type.rast +++ b/crates/parser/test_data/parser/inline/ok/function_ret_type.rast @@ -1,36 +1,29 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "bar" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/function_type_params.rast b/crates/parser/test_data/parser/inline/ok/function_type_params.rast index 3858e3eed577..d4ba2f73d842 100644 --- a/crates/parser/test_data/parser/inline/ok/function_type_params.rast +++ b/crates/parser/test_data/parser/inline/ok/function_type_params.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" GENERIC_PARAM_LIST @@ -9,18 +8,15 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Clone" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "Clone" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH @@ -34,5 +30,5 @@ SOURCE_FILE BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/function_where_clause.rast b/crates/parser/test_data/parser/inline/ok/function_where_clause.rast index a000d7e5928f..748dd5b9d297 100644 --- a/crates/parser/test_data/parser/inline/ok/function_where_clause.rast +++ b/crates/parser/test_data/parser/inline/ok/function_where_clause.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" GENERIC_PARAM_LIST @@ -12,29 +11,25 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE " " + WHERE_KW "where" [] [WHITESPACE(" ")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Copy" - WHITESPACE " " + IDENT "Copy" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/gen_blocks.rast b/crates/parser/test_data/parser/inline/ok/gen_blocks.rast index 6e8df9897e13..44a1a356d992 100644 --- a/crates/parser/test_data/parser/inline/ok/gen_blocks.rast +++ b/crates/parser/test_data/parser/inline/ok/gen_blocks.rast @@ -1,101 +1,71 @@ SOURCE_FILE FN - COMMENT "// 2024" - WHITESPACE "\n" VISIBILITY - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [COMMENT("// 2024"), NEWLINE("\n")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR - GEN_KW "gen" - WHITESPACE " " + GEN_KW "gen" [WHITESPACE(" ")] [WHITESPACE(" ")] STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT YIELD_EXPR - YIELD_KW "yield" - WHITESPACE " " + YIELD_KW "yield" [] [WHITESPACE(" ")] LITERAL STRING "\"\"" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR - ASYNC_KW "async" - WHITESPACE " " - GEN_KW "gen" - WHITESPACE " " + ASYNC_KW "async" [WHITESPACE(" ")] [WHITESPACE(" ")] + GEN_KW "gen" [] [WHITESPACE(" ")] STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT YIELD_EXPR - YIELD_KW "yield" - WHITESPACE " " + YIELD_KW "yield" [] [WHITESPACE(" ")] LITERAL STRING "\"\"" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR - GEN_KW "gen" - WHITESPACE " " - MOVE_KW "move" - WHITESPACE " " + GEN_KW "gen" [WHITESPACE(" ")] [WHITESPACE(" ")] + MOVE_KW "move" [] [WHITESPACE(" ")] STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT YIELD_EXPR - YIELD_KW "yield" - WHITESPACE " " + YIELD_KW "yield" [] [WHITESPACE(" ")] LITERAL STRING "\"\"" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR - ASYNC_KW "async" - WHITESPACE " " - GEN_KW "gen" - WHITESPACE " " - MOVE_KW "move" - WHITESPACE " " + ASYNC_KW "async" [WHITESPACE(" ")] [WHITESPACE(" ")] + GEN_KW "gen" [] [WHITESPACE(" ")] + MOVE_KW "move" [] [WHITESPACE(" ")] STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT YIELD_EXPR - YIELD_KW "yield" - WHITESPACE " " + YIELD_KW "yield" [] [WHITESPACE(" ")] LITERAL STRING "\"\"" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/generic_arg.rast b/crates/parser/test_data/parser/inline/ok/generic_arg.rast index e32cf085657f..3e7425e22e80 100644 --- a/crates/parser/test_data/parser/inline/ok/generic_arg.rast +++ b/crates/parser/test_data/parser/inline/ok/generic_arg.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -20,12 +17,10 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "i32" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_ARG DYN_TRAIT_TYPE - DYN_KW "dyn" - WHITESPACE " " + DYN_KW "dyn" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -33,8 +28,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "T" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_ARG FN_PTR_TYPE FN_KW "fn" @@ -42,5 +36,5 @@ SOURCE_FILE L_PAREN "(" R_PAREN ")" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/generic_arg_bounds.rast b/crates/parser/test_data/parser/inline/ok/generic_arg_bounds.rast index fee5913acaa5..d81cf9dee5dc 100644 --- a/crates/parser/test_data/parser/inline/ok/generic_arg_bounds.rast +++ b/crates/parser/test_data/parser/inline/ok/generic_arg_bounds.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "Plain" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Plain" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -20,8 +17,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Item" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_ARG PATH_TYPE PATH @@ -33,13 +29,11 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Item" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASSOC_TYPE_ARG NAME_REF IDENT "Item" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -47,30 +41,23 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Bound" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASSOC_TYPE_ARG NAME_REF - IDENT "Item" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Item" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Item" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "GenericArgs" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "GenericArgs" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -93,8 +80,7 @@ SOURCE_FILE NAME_REF IDENT "T" R_ANGLE ">" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_ARG PATH_TYPE PATH @@ -111,8 +97,7 @@ SOURCE_FILE NAME_REF IDENT "T" R_ANGLE ">" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASSOC_TYPE_ARG NAME_REF IDENT "Item" @@ -125,8 +110,7 @@ SOURCE_FILE NAME_REF IDENT "T" R_ANGLE ">" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -134,8 +118,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Bound" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASSOC_TYPE_ARG NAME_REF IDENT "Item" @@ -149,8 +132,7 @@ SOURCE_FILE NAME_REF IDENT "T" R_ANGLE ">" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -158,8 +140,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Bound" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASSOC_TYPE_ARG NAME_REF IDENT "Item" @@ -171,17 +152,14 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "T" - R_ANGLE ">" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Item" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASSOC_TYPE_ARG NAME_REF IDENT "Item" @@ -194,26 +172,20 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "T" - R_ANGLE ">" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Item" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "ParenthesizedArgs" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "ParenthesizedArgs" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -236,8 +208,7 @@ SOURCE_FILE NAME_REF IDENT "T" R_PAREN ")" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_ARG PATH_TYPE PATH @@ -254,8 +225,7 @@ SOURCE_FILE NAME_REF IDENT "T" R_PAREN ")" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASSOC_TYPE_ARG NAME_REF IDENT "Item" @@ -268,8 +238,7 @@ SOURCE_FILE NAME_REF IDENT "T" R_PAREN ")" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -277,8 +246,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Bound" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASSOC_TYPE_ARG NAME_REF IDENT "Item" @@ -292,8 +260,7 @@ SOURCE_FILE NAME_REF IDENT "T" R_PAREN ")" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -301,8 +268,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Bound" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASSOC_TYPE_ARG NAME_REF IDENT "Item" @@ -314,17 +280,14 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "T" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Item" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASSOC_TYPE_ARG NAME_REF IDENT "Item" @@ -337,26 +300,20 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "T" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Item" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "RTN" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "RTN" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -374,8 +331,7 @@ SOURCE_FILE L_PAREN "(" DOT2 ".." R_PAREN ")" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_ARG PATH_TYPE PATH @@ -386,8 +342,7 @@ SOURCE_FILE L_PAREN "(" DOT2 ".." R_PAREN ")" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASSOC_TYPE_ARG NAME_REF IDENT "Item" @@ -395,8 +350,7 @@ SOURCE_FILE L_PAREN "(" DOT2 ".." R_PAREN ")" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -404,8 +358,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Bound" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASSOC_TYPE_ARG NAME_REF IDENT "Item" @@ -413,8 +366,7 @@ SOURCE_FILE L_PAREN "(" DOT2 ".." R_PAREN ")" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -422,40 +374,34 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Bound" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASSOC_TYPE_ARG NAME_REF IDENT "Item" RETURN_TYPE_SYNTAX L_PAREN "(" DOT2 ".." - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Item" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASSOC_TYPE_ARG NAME_REF IDENT "Item" RETURN_TYPE_SYNTAX L_PAREN "(" DOT2 ".." - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Item" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/generic_const.rast b/crates/parser/test_data/parser/inline/ok/generic_const.rast index bf432b99b9de..c84b80da49e2 100644 --- a/crates/parser/test_data/parser/inline/ok/generic_const.rast +++ b/crates/parser/test_data/parser/inline/ok/generic_const.rast @@ -1,7 +1,6 @@ SOURCE_FILE CONST - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] NAME IDENT "C" GENERIC_PARAM_LIST @@ -10,35 +9,27 @@ SOURCE_FILE NAME IDENT "i32" R_ANGLE ">" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u32" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "u32" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] CONST - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "C" GENERIC_PARAM_LIST @@ -47,25 +38,20 @@ SOURCE_FILE LIFETIME LIFETIME_IDENT "'a" R_ANGLE ">" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_EXPR AMP "&" TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/generic_param_attribute.rast b/crates/parser/test_data/parser/inline/ok/generic_param_attribute.rast index 5567a53c56a2..5da32ef66e8f 100644 --- a/crates/parser/test_data/parser/inline/ok/generic_param_attribute.rast +++ b/crates/parser/test_data/parser/inline/ok/generic_param_attribute.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" GENERIC_PARAM_LIST @@ -15,12 +14,10 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "lt_attr" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] LIFETIME LIFETIME_IDENT "'a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_PARAM ATTR POUND "#" @@ -30,17 +27,15 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "t_attr" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] NAME IDENT "T" R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/generic_param_list.rast b/crates/parser/test_data/parser/inline/ok/generic_param_list.rast index becb77e042f1..4b24c357f0d8 100644 --- a/crates/parser/test_data/parser/inline/ok/generic_param_list.rast +++ b/crates/parser/test_data/parser/inline/ok/generic_param_list.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" GENERIC_PARAM_LIST @@ -9,8 +8,7 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -21,10 +19,9 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/global_asm.rast b/crates/parser/test_data/parser/inline/ok/global_asm.rast index 5337c56be178..dc9d7fd62554 100644 --- a/crates/parser/test_data/parser/inline/ok/global_asm.rast +++ b/crates/parser/test_data/parser/inline/ok/global_asm.rast @@ -6,5 +6,5 @@ SOURCE_FILE L_PAREN "(" LITERAL STRING "\"\"" - R_PAREN ")" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/guard_let_struct.rast b/crates/parser/test_data/parser/inline/ok/guard_let_struct.rast index 33754e621254..232aa7f643fe 100644 --- a/crates/parser/test_data/parser/inline/ok/guard_let_struct.rast +++ b/crates/parser/test_data/parser/inline/ok/guard_let_struct.rast @@ -1,68 +1,51 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM TUPLE_PAT - L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + L_PAREN "(" [WHITESPACE(" ")] [] + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_GUARD - IF_KW "if" - WHITESPACE " " + IF_KW "if" [] [WHITESPACE(" ")] LET_EXPR - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] RECORD_PAT PATH PATH_SEGMENT NAME_REF - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_CURLY "}" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_CURLY "}" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/half_open_range_pat.rast b/crates/parser/test_data/parser/inline/ok/half_open_range_pat.rast index a1822301047e..5d4c8f721196 100644 --- a/crates/parser/test_data/parser/inline/ok/half_open_range_pat.rast +++ b/crates/parser/test_data/parser/inline/ok/half_open_range_pat.rast @@ -1,99 +1,72 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] RANGE_PAT LITERAL_PAT LITERAL - INT_NUMBER "0" - WHITESPACE " " - DOT2 ".." - WHITESPACE " " - EQ "=" - WHITESPACE " " + INT_NUMBER "0" [] [WHITESPACE(" ")] + DOT2 ".." [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1u32" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] RANGE_PAT LITERAL_PAT LITERAL INT_NUMBER "0" DOT2 ".." - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] INFER_TYPE - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1u32" - SEMICOLON ";" - WHITESPACE "\n\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL - INT_NUMBER "42" - WHITESPACE " " + INT_NUMBER "42" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM RANGE_PAT LITERAL_PAT LITERAL - INT_NUMBER "0" - WHITESPACE " " - DOT2 ".." - WHITESPACE " " + INT_NUMBER "0" [WHITESPACE(" ")] [WHITESPACE(" ")] + DOT2 ".." [] [WHITESPACE(" ")] MATCH_GUARD - IF_KW "if" - WHITESPACE " " + IF_KW "if" [] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] REF_PAT AMP "&" PAREN_PAT @@ -103,21 +76,16 @@ SOURCE_FILE LITERAL_PAT LITERAL INT_NUMBER "0" - DOT2 ".." - WHITESPACE " " - PIPE "|" - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] + PIPE "|" [] [WHITESPACE(" ")] WILDCARD_PAT UNDERSCORE "_" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_EXPR AMP "&" LITERAL INT_NUMBER "0_i32" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/if_expr.rast b/crates/parser/test_data/parser/inline/ok/if_expr.rast index e2e964e44d12..e25d8e40349e 100644 --- a/crates/parser/test_data/parser/inline/ok/if_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/if_expr.rast @@ -1,126 +1,94 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE " " - ELSE_KW "else" - WHITESPACE " " + R_CURLY "}" [] [WHITESPACE(" ")] + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE " " - ELSE_KW "else" - WHITESPACE " " + R_CURLY "}" [] [WHITESPACE(" ")] + ELSE_KW "else" [] [WHITESPACE(" ")] IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [] [WHITESPACE(" ")] LITERAL - FALSE_KW "false" - WHITESPACE " " + FALSE_KW "false" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE " " - ELSE_KW "else" - WHITESPACE " " + R_CURLY "}" [] [WHITESPACE(" ")] + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - ELSE_KW "else" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/impl_item.rast b/crates/parser/test_data/parser/inline/ok/impl_item.rast index 879676309a2c..451c37dfc8ff 100644 --- a/crates/parser/test_data/parser/inline/ok/impl_item.rast +++ b/crates/parser/test_data/parser/inline/ok/impl_item.rast @@ -1,14 +1,12 @@ SOURCE_FILE IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/impl_item_const.rast b/crates/parser/test_data/parser/inline/ok/impl_item_const.rast index f7c7aaabc7cb..36953bf7514e 100644 --- a/crates/parser/test_data/parser/inline/ok/impl_item_const.rast +++ b/crates/parser/test_data/parser/inline/ok/impl_item_const.rast @@ -1,24 +1,19 @@ SOURCE_FILE IMPL - IMPL_KW "impl" - WHITESPACE " " - CONST_KW "const" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] + CONST_KW "const" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Send" - WHITESPACE " " - FOR_KW "for" - WHITESPACE " " + IDENT "Send" [] [WHITESPACE(" ")] + FOR_KW "for" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/impl_item_neg.rast b/crates/parser/test_data/parser/inline/ok/impl_item_neg.rast index 805052fbcae4..ffad4cd6a9e6 100644 --- a/crates/parser/test_data/parser/inline/ok/impl_item_neg.rast +++ b/crates/parser/test_data/parser/inline/ok/impl_item_neg.rast @@ -1,23 +1,19 @@ SOURCE_FILE IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] BANG "!" PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Send" - WHITESPACE " " - FOR_KW "for" - WHITESPACE " " + IDENT "Send" [] [WHITESPACE(" ")] + FOR_KW "for" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/impl_item_never_type.rast b/crates/parser/test_data/parser/inline/ok/impl_item_never_type.rast index fa4575e0ce0c..71cb07a27296 100644 --- a/crates/parser/test_data/parser/inline/ok/impl_item_never_type.rast +++ b/crates/parser/test_data/parser/inline/ok/impl_item_never_type.rast @@ -1,11 +1,9 @@ SOURCE_FILE IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] NEVER_TYPE - BANG "!" - WHITESPACE " " + BANG "!" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/impl_restrictions.rast b/crates/parser/test_data/parser/inline/ok/impl_restrictions.rast index bf7b5c5a34f0..23ae5620ac27 100644 --- a/crates/parser/test_data/parser/inline/ok/impl_restrictions.rast +++ b/crates/parser/test_data/parser/inline/ok/impl_restrictions.rast @@ -1,8 +1,7 @@ SOURCE_FILE TRAIT VISIBILITY - PUB_KW "pub" - WHITESPACE " " + PUB_KW "pub" [] [WHITESPACE(" ")] IMPL_RESTRICTION IMPL_KW "impl" VISIBILITY_INNER @@ -11,26 +10,20 @@ SOURCE_FILE PATH_SEGMENT NAME_REF CRATE_KW "crate" - R_PAREN ")" - WHITESPACE " " - UNSAFE_KW "unsafe" - WHITESPACE " " - TRAIT_KW "trait" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] + TRAIT_KW "trait" [] [WHITESPACE(" ")] NAME - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] TRAIT IMPL_RESTRICTION IMPL_KW "impl" VISIBILITY_INNER L_PAREN "(" - IN_KW "in" - WHITESPACE " " + IN_KW "in" [] [WHITESPACE(" ")] PATH PATH PATH_SEGMENT @@ -40,31 +33,23 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "bar" - R_PAREN ")" - WHITESPACE " " - TRAIT_KW "trait" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + TRAIT_KW "trait" [] [WHITESPACE(" ")] NAME - IDENT "Bar" - WHITESPACE " " + IDENT "Bar" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] PAREN_TYPE L_PAREN "(" PATH_TYPE @@ -72,9 +57,8 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "i32" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/impl_trait_type.rast b/crates/parser/test_data/parser/inline/ok/impl_trait_type.rast index c7478da942b5..5d81ac330fa6 100644 --- a/crates/parser/test_data/parser/inline/ok/impl_trait_type.rast +++ b/crates/parser/test_data/parser/inline/ok/impl_trait_type.rast @@ -1,15 +1,11 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "A" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "A" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] IMPL_TRAIT_TYPE - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -34,12 +30,10 @@ SOURCE_FILE LIFETIME LIFETIME_IDENT "'a" R_ANGLE ">" - R_ANGLE ">" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND LIFETIME LIFETIME_IDENT "'a" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/impl_type_params.rast b/crates/parser/test_data/parser/inline/ok/impl_type_params.rast index 24977a22a5fc..5ab5cbf3cb79 100644 --- a/crates/parser/test_data/parser/inline/ok/impl_type_params.rast +++ b/crates/parser/test_data/parser/inline/ok/impl_type_params.rast @@ -4,19 +4,16 @@ SOURCE_FILE GENERIC_PARAM_LIST L_ANGLE "<" CONST_PARAM - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] NAME IDENT "N" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u32" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -30,9 +27,8 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "N" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/include_bytes.rast b/crates/parser/test_data/parser/inline/ok/include_bytes.rast index df47eb92074b..0528ad092f4d 100644 --- a/crates/parser/test_data/parser/inline/ok/include_bytes.rast +++ b/crates/parser/test_data/parser/inline/ok/include_bytes.rast @@ -1,23 +1,17 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] INCLUDE_BYTES_EXPR - BUILTIN_KW "builtin" - WHITESPACE " " - POUND "#" - WHITESPACE " " - INCLUDE_BYTES_KW "include_bytes" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + BUILTIN_KW "builtin" [] [WHITESPACE(" ")] + POUND "#" [] [WHITESPACE(" ")] + INCLUDE_BYTES_KW "include_bytes" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/index_expr.rast b/crates/parser/test_data/parser/inline/ok/index_expr.rast index 6969259fc089..ffde045a60bd 100644 --- a/crates/parser/test_data/parser/inline/ok/index_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/index_expr.rast @@ -1,17 +1,14 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT INDEX_EXPR INDEX_EXPR @@ -19,7 +16,7 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] L_BRACK "[" LITERAL INT_NUMBER "1" @@ -28,7 +25,6 @@ SOURCE_FILE LITERAL INT_NUMBER "2" R_BRACK "]" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/label.rast b/crates/parser/test_data/parser/inline/ok/label.rast index 48d0bde845a5..0213993a279f 100644 --- a/crates/parser/test_data/parser/inline/ok/label.rast +++ b/crates/parser/test_data/parser/inline/ok/label.rast @@ -1,70 +1,54 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT LOOP_EXPR LABEL LIFETIME - LIFETIME_IDENT "'a" - COLON ":" - WHITESPACE " " - LOOP_KW "loop" - WHITESPACE " " + LIFETIME_IDENT "'a" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] + LOOP_KW "loop" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT WHILE_EXPR LABEL LIFETIME - LIFETIME_IDENT "'b" - COLON ":" - WHITESPACE " " - WHILE_KW "while" - WHITESPACE " " + LIFETIME_IDENT "'b" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] + WHILE_KW "while" [] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FOR_EXPR LABEL LIFETIME - LIFETIME_IDENT "'c" - COLON ":" - WHITESPACE " " - FOR_KW "for" - WHITESPACE " " + LIFETIME_IDENT "'c" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] + FOR_KW "for" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "x" - WHITESPACE " " - IN_KW "in" - WHITESPACE " " + IDENT "x" [] [WHITESPACE(" ")] + IN_KW "in" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/labeled_block.rast b/crates/parser/test_data/parser/inline/ok/labeled_block.rast index 181251d4f4f6..87290bf67acc 100644 --- a/crates/parser/test_data/parser/inline/ok/labeled_block.rast +++ b/crates/parser/test_data/parser/inline/ok/labeled_block.rast @@ -1,28 +1,23 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT BLOCK_EXPR LABEL LIFETIME LIFETIME_IDENT "'label" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/lambda_expr.rast b/crates/parser/test_data/parser/inline/ok/lambda_expr.rast index bf24a579124e..81476c0c5723 100644 --- a/crates/parser/test_data/parser/inline/ok/lambda_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/lambda_expr.rast @@ -1,248 +1,198 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT CLOSURE_EXPR PARAM_LIST - PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [WHITESPACE(" ")] [] + PIPE "|" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CLOSURE_EXPR PARAM_LIST - PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [WHITESPACE(" ")] [] + PIPE "|" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " + IDENT "i32" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "92" - WHITESPACE " " + INT_NUMBER "92" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CLOSURE_EXPR PARAM_LIST - PIPE "|" + PIPE "|" [WHITESPACE(" ")] [] PARAM IDENT_PAT NAME IDENT "x" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "x" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CLOSURE_EXPR - MOVE_KW "move" - WHITESPACE " " + MOVE_KW "move" [WHITESPACE(" ")] [WHITESPACE(" ")] PARAM_LIST PIPE "|" PARAM IDENT_PAT NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" COMMA "," - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "x" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CLOSURE_EXPR - ASYNC_KW "async" - WHITESPACE " " + ASYNC_KW "async" [WHITESPACE(" ")] [WHITESPACE(" ")] PARAM_LIST PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CLOSURE_EXPR - MOVE_KW "move" - WHITESPACE " " + MOVE_KW "move" [WHITESPACE(" ")] [WHITESPACE(" ")] PARAM_LIST PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CLOSURE_EXPR - ASYNC_KW "async" - WHITESPACE " " - MOVE_KW "move" - WHITESPACE " " + ASYNC_KW "async" [WHITESPACE(" ")] [WHITESPACE(" ")] + MOVE_KW "move" [] [WHITESPACE(" ")] PARAM_LIST PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CLOSURE_EXPR - STATIC_KW "static" - WHITESPACE " " + STATIC_KW "static" [WHITESPACE(" ")] [WHITESPACE(" ")] PARAM_LIST PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CLOSURE_EXPR - STATIC_KW "static" - WHITESPACE " " - MOVE_KW "move" - WHITESPACE " " + STATIC_KW "static" [WHITESPACE(" ")] [WHITESPACE(" ")] + MOVE_KW "move" [] [WHITESPACE(" ")] PARAM_LIST PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CLOSURE_EXPR - STATIC_KW "static" - WHITESPACE " " - ASYNC_KW "async" - WHITESPACE " " + STATIC_KW "static" [WHITESPACE(" ")] [WHITESPACE(" ")] + ASYNC_KW "async" [] [WHITESPACE(" ")] PARAM_LIST PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CLOSURE_EXPR - STATIC_KW "static" - WHITESPACE " " - ASYNC_KW "async" - WHITESPACE " " - MOVE_KW "move" - WHITESPACE " " + STATIC_KW "static" [WHITESPACE(" ")] [WHITESPACE(" ")] + ASYNC_KW "async" [] [WHITESPACE(" ")] + MOVE_KW "move" [] [WHITESPACE(" ")] PARAM_LIST PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CLOSURE_EXPR FOR_BINDER - FOR_KW "for" + FOR_KW "for" [WHITESPACE(" ")] [] GENERIC_PARAM_LIST L_ANGLE "<" LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] PARAM_LIST PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CLOSURE_EXPR FOR_BINDER - FOR_KW "for" + FOR_KW "for" [WHITESPACE(" ")] [] GENERIC_PARAM_LIST L_ANGLE "<" LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " - MOVE_KW "move" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] + MOVE_KW "move" [] [WHITESPACE(" ")] PARAM_LIST PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/lambda_ret_block.rast b/crates/parser/test_data/parser/inline/ok/lambda_ret_block.rast index 93238bd8f17d..6408d9954b02 100644 --- a/crates/parser/test_data/parser/inline/ok/lambda_ret_block.rast +++ b/crates/parser/test_data/parser/inline/ok/lambda_ret_block.rast @@ -1,45 +1,36 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT CALL_EXPR CLOSURE_EXPR PARAM_LIST PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " + IDENT "i32" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "92" - WHITESPACE " " + INT_NUMBER "92" [] [WHITESPACE(" ")] R_CURLY "}" ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/let_else.rast b/crates/parser/test_data/parser/inline/ok/let_else.rast index ce7f1a35e8d3..7ce1daac9bed 100644 --- a/crates/parser/test_data/parser/inline/ok/let_else.rast +++ b/crates/parser/test_data/parser/inline/ok/let_else.rast @@ -1,20 +1,16 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] TUPLE_STRUCT_PAT PATH PATH_SEGMENT @@ -24,28 +20,21 @@ SOURCE_FILE IDENT_PAT NAME IDENT "x" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "opt" - WHITESPACE " " + IDENT "opt" [] [WHITESPACE(" ")] LET_ELSE - ELSE_KW "else" - WHITESPACE " " + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RETURN_EXPR - RETURN_KW "return" - WHITESPACE " " + RETURN_KW "return" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/let_expr.rast b/crates/parser/test_data/parser/inline/ok/let_expr.rast index dcffcb1ce2f6..7943f8497425 100644 --- a/crates/parser/test_data/parser/inline/ok/let_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/let_expr.rast @@ -1,25 +1,20 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] BIN_EXPR LET_EXPR - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] TUPLE_STRUCT_PAT PATH PATH_SEGMENT @@ -28,63 +23,47 @@ SOURCE_FILE L_PAREN "(" WILDCARD_PAT UNDERSCORE "_" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "None" - WHITESPACE " " - AMP2 "&&" - WHITESPACE " " + IDENT "None" [] [WHITESPACE(" ")] + AMP2 "&&" [] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] WHILE_EXPR - WHILE_KW "while" - WHITESPACE " " + WHILE_KW "while" [WHITESPACE(" ")] [WHITESPACE(" ")] BIN_EXPR BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - EQ2 "==" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + EQ2 "==" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "5" - WHITESPACE " " - AMP2 "&&" - WHITESPACE " " + INT_NUMBER "5" [] [WHITESPACE(" ")] + AMP2 "&&" [] [WHITESPACE(" ")] PAREN_EXPR L_PAREN "(" LET_EXPR - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "None" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "None" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "None" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/let_stmt.rast b/crates/parser/test_data/parser/inline/ok/let_stmt.rast index d99dad4cedd1..87dd3dcd6262 100644 --- a/crates/parser/test_data/parser/inline/ok/let_stmt.rast +++ b/crates/parser/test_data/parser/inline/ok/let_stmt.rast @@ -1,47 +1,36 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "i32" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "92" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] LET_STMT - SUPER_KW "super" - WHITESPACE " " - LET_KW "let" - WHITESPACE " " + SUPER_KW "super" [] [WHITESPACE(" ")] + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "y" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] EXPR_STMT PATH_EXPR PATH @@ -53,7 +42,6 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "foo" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/let_stmt_ascription.rast b/crates/parser/test_data/parser/inline/ok/let_stmt_ascription.rast index ac8e1d93cb6e..0bfa8293c20b 100644 --- a/crates/parser/test_data/parser/inline/ok/let_stmt_ascription.rast +++ b/crates/parser/test_data/parser/inline/ok/let_stmt_ascription.rast @@ -1,31 +1,25 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/let_stmt_init.rast b/crates/parser/test_data/parser/inline/ok/let_stmt_init.rast index 1b639915878c..39a10bc9702e 100644 --- a/crates/parser/test_data/parser/inline/ok/let_stmt_init.rast +++ b/crates/parser/test_data/parser/inline/ok/let_stmt_init.rast @@ -1,29 +1,22 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "x" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "92" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/lifetime_arg.rast b/crates/parser/test_data/parser/inline/ok/lifetime_arg.rast index dbd7ff3061a2..f2c6a5070273 100644 --- a/crates/parser/test_data/parser/inline/ok/lifetime_arg.rast +++ b/crates/parser/test_data/parser/inline/ok/lifetime_arg.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -18,5 +15,5 @@ SOURCE_FILE LIFETIME LIFETIME_IDENT "'static" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/lifetime_param.rast b/crates/parser/test_data/parser/inline/ok/lifetime_param.rast index 315200aca21c..82163e4af1c8 100644 --- a/crates/parser/test_data/parser/inline/ok/lifetime_param.rast +++ b/crates/parser/test_data/parser/inline/ok/lifetime_param.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" GENERIC_PARAM_LIST @@ -9,8 +8,7 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME @@ -18,10 +16,9 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/literal_pattern.rast b/crates/parser/test_data/parser/inline/ok/literal_pattern.rast index c83ea7ade719..afba447ce3e0 100644 --- a/crates/parser/test_data/parser/inline/ok/literal_pattern.rast +++ b/crates/parser/test_data/parser/inline/ok/literal_pattern.rast @@ -1,77 +1,58 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM LITERAL_PAT - MINUS "-" + MINUS "-" [WHITESPACE(" ")] [] LITERAL - INT_NUMBER "1" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM LITERAL_PAT LITERAL - INT_NUMBER "92" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + INT_NUMBER "92" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM LITERAL_PAT LITERAL - CHAR "'c'" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + CHAR "'c'" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM LITERAL_PAT LITERAL - STRING "\"hello\"" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + STRING "\"hello\"" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/loop_expr.rast b/crates/parser/test_data/parser/inline/ok/loop_expr.rast index ab3b49b0d6c5..dd53a55a9b84 100644 --- a/crates/parser/test_data/parser/inline/ok/loop_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/loop_expr.rast @@ -1,26 +1,21 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT LOOP_EXPR - LOOP_KW "loop" - WHITESPACE " " + LOOP_KW "loop" [WHITESPACE(" ")] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/macro_call_type.rast b/crates/parser/test_data/parser/inline/ok/macro_call_type.rast index 8165cb7d9baf..cf852fa334ea 100644 --- a/crates/parser/test_data/parser/inline/ok/macro_call_type.rast +++ b/crates/parser/test_data/parser/inline/ok/macro_call_type.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "A" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "A" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] MACRO_TYPE MACRO_CALL PATH @@ -17,16 +14,12 @@ SOURCE_FILE TOKEN_TREE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "B" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "B" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] MACRO_TYPE MACRO_CALL PATH @@ -42,5 +35,5 @@ SOURCE_FILE TOKEN_TREE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/macro_def.rast b/crates/parser/test_data/parser/inline/ok/macro_def.rast index f73229b2e30b..e8b1ab622db2 100644 --- a/crates/parser/test_data/parser/inline/ok/macro_def.rast +++ b/crates/parser/test_data/parser/inline/ok/macro_def.rast @@ -1,7 +1,6 @@ SOURCE_FILE MACRO_DEF - MACRO_KW "macro" - WHITESPACE " " + MACRO_KW "macro" [] [WHITESPACE(" ")] NAME IDENT "m" TOKEN_TREE @@ -10,9 +9,8 @@ SOURCE_FILE IDENT "i" COLON ":" IDENT "ident" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] TOKEN_TREE L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/macro_def_curly.rast b/crates/parser/test_data/parser/inline/ok/macro_def_curly.rast index 5cf305d26581..0a948d5b382c 100644 --- a/crates/parser/test_data/parser/inline/ok/macro_def_curly.rast +++ b/crates/parser/test_data/parser/inline/ok/macro_def_curly.rast @@ -1,27 +1,21 @@ SOURCE_FILE MACRO_DEF - MACRO_KW "macro" - WHITESPACE " " + MACRO_KW "macro" [] [WHITESPACE(" ")] NAME - IDENT "m" - WHITESPACE " " + IDENT "m" [] [WHITESPACE(" ")] TOKEN_TREE - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] TOKEN_TREE L_PAREN "(" DOLLAR "$" IDENT "i" COLON ":" IDENT "ident" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] EQ "=" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] TOKEN_TREE L_CURLY "{" - R_CURLY "}" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/macro_inside_generic_arg.rast b/crates/parser/test_data/parser/inline/ok/macro_inside_generic_arg.rast index 88f8a73450fa..4753b56c6d98 100644 --- a/crates/parser/test_data/parser/inline/ok/macro_inside_generic_arg.rast +++ b/crates/parser/test_data/parser/inline/ok/macro_inside_generic_arg.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "A" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "A" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -32,5 +29,5 @@ SOURCE_FILE UNDERSCORE "_" R_BRACK "]" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/macro_rules_as_macro_name.rast b/crates/parser/test_data/parser/inline/ok/macro_rules_as_macro_name.rast index b997250ab4d2..6c96c1e4dfa3 100644 --- a/crates/parser/test_data/parser/inline/ok/macro_rules_as_macro_name.rast +++ b/crates/parser/test_data/parser/inline/ok/macro_rules_as_macro_name.rast @@ -4,58 +4,46 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "macro_rules" - BANG "!" - WHITESPACE " " + BANG "!" [] [WHITESPACE(" ")] TOKEN_TREE L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] MACRO_CALL PATH PATH_SEGMENT NAME_REF IDENT "macro_rules" - BANG "!" - WHITESPACE " " + BANG "!" [] [WHITESPACE(" ")] TOKEN_TREE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] MACRO_CALL PATH PATH_SEGMENT NAME_REF IDENT "macro_rules" - BANG "!" - WHITESPACE " " + BANG "!" [] [WHITESPACE(" ")] TOKEN_TREE L_BRACK "[" R_BRACK "]" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] MACRO_EXPR MACRO_CALL PATH @@ -66,7 +54,6 @@ SOURCE_FILE TOKEN_TREE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/macro_rules_non_brace.rast b/crates/parser/test_data/parser/inline/ok/macro_rules_non_brace.rast index 45cd4d2aa120..ddd01630c0c9 100644 --- a/crates/parser/test_data/parser/inline/ok/macro_rules_non_brace.rast +++ b/crates/parser/test_data/parser/inline/ok/macro_rules_non_brace.rast @@ -1,57 +1,44 @@ SOURCE_FILE MACRO_RULES MACRO_RULES_KW "macro_rules" - BANG "!" - WHITESPACE " " + BANG "!" [] [WHITESPACE(" ")] NAME - IDENT "m" - WHITESPACE " " + IDENT "m" [] [WHITESPACE(" ")] TOKEN_TREE - L_PAREN "(" - WHITESPACE " " + L_PAREN "(" [] [WHITESPACE(" ")] TOKEN_TREE L_PAREN "(" DOLLAR "$" IDENT "i" COLON ":" IDENT "ident" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] EQ "=" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] TOKEN_TREE L_CURLY "{" - R_CURLY "}" - WHITESPACE " " + R_CURLY "}" [] [WHITESPACE(" ")] R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] MACRO_RULES MACRO_RULES_KW "macro_rules" - BANG "!" - WHITESPACE " " + BANG "!" [] [WHITESPACE(" ")] NAME - IDENT "m" - WHITESPACE " " + IDENT "m" [] [WHITESPACE(" ")] TOKEN_TREE - L_BRACK "[" - WHITESPACE " " + L_BRACK "[" [] [WHITESPACE(" ")] TOKEN_TREE L_PAREN "(" DOLLAR "$" IDENT "i" COLON ":" IDENT "ident" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] EQ "=" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] TOKEN_TREE L_CURLY "{" - R_CURLY "}" - WHITESPACE " " + R_CURLY "}" [] [WHITESPACE(" ")] R_BRACK "]" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/marco_pat.rast b/crates/parser/test_data/parser/inline/ok/marco_pat.rast index cedaa904533a..bbb7888a7811 100644 --- a/crates/parser/test_data/parser/inline/ok/marco_pat.rast +++ b/crates/parser/test_data/parser/inline/ok/marco_pat.rast @@ -1,20 +1,16 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] MACRO_PAT MACRO_CALL PATH @@ -25,13 +21,10 @@ SOURCE_FILE TOKEN_TREE L_PAREN "(" IDENT "x" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/match_arm.rast b/crates/parser/test_data/parser/inline/ok/match_arm.rast index 922102816292..533c1e198b66 100644 --- a/crates/parser/test_data/parser/inline/ok/match_arm.rast +++ b/crates/parser/test_data/parser/inline/ok/match_arm.rast @@ -1,55 +1,42 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] MATCH_GUARD - IF_KW "if" - WHITESPACE " " + IF_KW "if" [] [WHITESPACE(" ")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "Test" - WHITESPACE " " - R_ANGLE ">" - WHITESPACE " " + IDENT "Test" [] [WHITESPACE(" ")] + R_ANGLE ">" [] [WHITESPACE(" ")] RECORD_EXPR PATH PATH_SEGMENT @@ -60,94 +47,70 @@ SOURCE_FILE RECORD_EXPR_FIELD NAME_REF IDENT "field" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - R_CURLY "}" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_CURLY "}" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM OR_PAT IDENT_PAT NAME - IDENT "X" - WHITESPACE " " - PIPE "|" - WHITESPACE " " + IDENT "X" [WHITESPACE(" ")] [WHITESPACE(" ")] + PIPE "|" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "Y" - WHITESPACE " " + IDENT "Y" [] [WHITESPACE(" ")] MATCH_GUARD - IF_KW "if" - WHITESPACE " " + IF_KW "if" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "Z" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + IDENT "Z" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM OR_PAT - PIPE "|" - WHITESPACE " " + PIPE "|" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "X" - WHITESPACE " " - PIPE "|" - WHITESPACE " " + IDENT "X" [] [WHITESPACE(" ")] + PIPE "|" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "Y" - WHITESPACE " " + IDENT "Y" [] [WHITESPACE(" ")] MATCH_GUARD - IF_KW "if" - WHITESPACE " " + IF_KW "if" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "Z" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + IDENT "Z" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM OR_PAT - PIPE "|" - WHITESPACE " " + PIPE "|" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "X" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + IDENT "X" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/match_arms_commas.rast b/crates/parser/test_data/parser/inline/ok/match_arms_commas.rast index 94897c2d2047..786709311cfd 100644 --- a/crates/parser/test_data/parser/inline/ok/match_arms_commas.rast +++ b/crates/parser/test_data/parser/inline/ok/match_arms_commas.rast @@ -1,60 +1,44 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/match_arms_inner_attribute.rast b/crates/parser/test_data/parser/inline/ok/match_arms_inner_attribute.rast index edb04387336a..2c851a0218dd 100644 --- a/crates/parser/test_data/parser/inline/ok/match_arms_inner_attribute.rast +++ b/crates/parser/test_data/parser/inline/ok/match_arms_inner_attribute.rast @@ -1,29 +1,23 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] BANG "!" L_BRACK "[" TOKEN_TREE_META @@ -35,10 +29,9 @@ SOURCE_FILE L_PAREN "(" STRING "\"Inner attribute\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " + R_BRACK "]" [] [NEWLINE("\n")] ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] BANG "!" L_BRACK "[" TOKEN_TREE_META @@ -50,10 +43,9 @@ SOURCE_FILE L_PAREN "(" STRING "\"Can be\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " + R_BRACK "]" [] [NEWLINE("\n")] ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] BANG "!" L_BRACK "[" TOKEN_TREE_META @@ -65,20 +57,15 @@ SOURCE_FILE L_PAREN "(" STRING "\"Stacked\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " + R_BRACK "]" [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/match_arms_outer_attributes.rast b/crates/parser/test_data/parser/inline/ok/match_arms_outer_attributes.rast index 321db782d133..9ae86c6b9d1f 100644 --- a/crates/parser/test_data/parser/inline/ok/match_arms_outer_attributes.rast +++ b/crates/parser/test_data/parser/inline/ok/match_arms_outer_attributes.rast @@ -1,136 +1,105 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] L_BRACK "[" CFG_META CFG_KW "cfg" L_PAREN "(" CFG_ATOM - IDENT "feature" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "feature" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] STRING "\"some\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " + R_BRACK "]" [] [NEWLINE("\n")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] L_BRACK "[" CFG_META CFG_KW "cfg" L_PAREN "(" CFG_ATOM - IDENT "feature" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "feature" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] STRING "\"other\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " + R_BRACK "]" [] [NEWLINE("\n")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] L_BRACK "[" CFG_META CFG_KW "cfg" L_PAREN "(" CFG_ATOM - IDENT "feature" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "feature" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] STRING "\"many\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " + R_BRACK "]" [] [NEWLINE("\n")] ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] L_BRACK "[" CFG_META CFG_KW "cfg" L_PAREN "(" CFG_ATOM - IDENT "feature" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "feature" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] STRING "\"attributes\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " + R_BRACK "]" [] [NEWLINE("\n")] ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] L_BRACK "[" CFG_META CFG_KW "cfg" L_PAREN "(" CFG_ATOM - IDENT "feature" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "feature" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] STRING "\"before\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " + R_BRACK "]" [] [NEWLINE("\n")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/match_expr.rast b/crates/parser/test_data/parser/inline/ok/match_expr.rast index 0d6cd390ea07..ed2b82b7bc61 100644 --- a/crates/parser/test_data/parser/inline/ok/match_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/match_expr.rast @@ -1,96 +1,72 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] MATCH_ARM_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " + R_CURLY "}" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] MATCH_ARM_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/match_guard.rast b/crates/parser/test_data/parser/inline/ok/match_guard.rast index 96318b52195e..3ec9d1a87060 100644 --- a/crates/parser/test_data/parser/inline/ok/match_guard.rast +++ b/crates/parser/test_data/parser/inline/ok/match_guard.rast @@ -1,77 +1,57 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] MATCH_GUARD - IF_KW "if" - WHITESPACE " " + IF_KW "if" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "foo" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] MATCH_GUARD - IF_KW "if" - WHITESPACE " " + IF_KW "if" [] [WHITESPACE(" ")] LET_EXPR - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "bar" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + IDENT "bar" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/maybe_const_trait_bound.rast b/crates/parser/test_data/parser/inline/ok/maybe_const_trait_bound.rast index 8d12f814c2a3..4444cca40e38 100644 --- a/crates/parser/test_data/parser/inline/ok/maybe_const_trait_bound.rast +++ b/crates/parser/test_data/parser/inline/ok/maybe_const_trait_bound.rast @@ -1,9 +1,7 @@ SOURCE_FILE FN - CONST_KW "const" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST @@ -11,26 +9,22 @@ SOURCE_FILE PARAM WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] IMPL_TRAIT_TYPE - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND L_BRACK "[" CONST_KW "const" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Trait" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/metas.rast b/crates/parser/test_data/parser/inline/ok/metas.rast index 6360552a6f06..a60b06f7ae79 100644 --- a/crates/parser/test_data/parser/inline/ok/metas.rast +++ b/crates/parser/test_data/parser/inline/ok/metas.rast @@ -8,8 +8,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "simple_ident" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -24,8 +23,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "path" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -34,14 +32,11 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "simple_ident_expr" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "simple_ident_expr" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL STRING "\"\"" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -60,14 +55,11 @@ SOURCE_FILE COLON2 "::" PATH_SEGMENT NAME_REF - IDENT "Expr" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Expr" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL STRING "\"\"" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -79,14 +71,11 @@ SOURCE_FILE IDENT "simple_ident_tt" TOKEN_TREE L_PAREN "(" - IDENT "a" - WHITESPACE " " - IDENT "b" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + IDENT "b" [] [WHITESPACE(" ")] IDENT "c" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -98,14 +87,11 @@ SOURCE_FILE IDENT "simple_ident_tt" TOKEN_TREE L_BRACK "[" - IDENT "a" - WHITESPACE " " - IDENT "b" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + IDENT "b" [] [WHITESPACE(" ")] IDENT "c" R_BRACK "]" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -117,14 +103,11 @@ SOURCE_FILE IDENT "simple_ident_tt" TOKEN_TREE L_CURLY "{" - IDENT "a" - WHITESPACE " " - IDENT "b" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + IDENT "b" [] [WHITESPACE(" ")] IDENT "c" R_CURLY "}" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -146,14 +129,11 @@ SOURCE_FILE IDENT "tt" TOKEN_TREE L_PAREN "(" - IDENT "a" - WHITESPACE " " - IDENT "b" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + IDENT "b" [] [WHITESPACE(" ")] IDENT "c" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -175,14 +155,11 @@ SOURCE_FILE IDENT "tt" TOKEN_TREE L_BRACK "[" - IDENT "a" - WHITESPACE " " - IDENT "b" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + IDENT "b" [] [WHITESPACE(" ")] IDENT "c" R_BRACK "]" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -204,14 +181,11 @@ SOURCE_FILE IDENT "tt" TOKEN_TREE L_CURLY "{" - IDENT "a" - WHITESPACE " " - IDENT "b" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + IDENT "b" [] [WHITESPACE(" ")] IDENT "c" R_CURLY "}" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -225,8 +199,7 @@ SOURCE_FILE NAME_REF IDENT "simple_ident" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -245,8 +218,7 @@ SOURCE_FILE NAME_REF IDENT "path" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -258,15 +230,12 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "simple_ident_expr" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "simple_ident_expr" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL STRING "\"\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -288,15 +257,12 @@ SOURCE_FILE COLON2 "::" PATH_SEGMENT NAME_REF - IDENT "Expr" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Expr" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL STRING "\"\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -311,15 +277,12 @@ SOURCE_FILE IDENT "simple_ident_tt" TOKEN_TREE L_PAREN "(" - IDENT "a" - WHITESPACE " " - IDENT "b" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + IDENT "b" [] [WHITESPACE(" ")] IDENT "c" R_PAREN ")" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -334,15 +297,12 @@ SOURCE_FILE IDENT "simple_ident_tt" TOKEN_TREE L_BRACK "[" - IDENT "a" - WHITESPACE " " - IDENT "b" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + IDENT "b" [] [WHITESPACE(" ")] IDENT "c" R_BRACK "]" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -357,15 +317,12 @@ SOURCE_FILE IDENT "simple_ident_tt" TOKEN_TREE L_CURLY "{" - IDENT "a" - WHITESPACE " " - IDENT "b" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + IDENT "b" [] [WHITESPACE(" ")] IDENT "c" R_CURLY "}" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -390,15 +347,12 @@ SOURCE_FILE IDENT "tt" TOKEN_TREE L_PAREN "(" - IDENT "a" - WHITESPACE " " - IDENT "b" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + IDENT "b" [] [WHITESPACE(" ")] IDENT "c" R_PAREN ")" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -423,15 +377,12 @@ SOURCE_FILE IDENT "tt" TOKEN_TREE L_BRACK "[" - IDENT "a" - WHITESPACE " " - IDENT "b" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + IDENT "b" [] [WHITESPACE(" ")] IDENT "c" R_BRACK "]" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -456,12 +407,10 @@ SOURCE_FILE IDENT "tt" TOKEN_TREE L_CURLY "{" - IDENT "a" - WHITESPACE " " - IDENT "b" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + IDENT "b" [] [WHITESPACE(" ")] IDENT "c" R_CURLY "}" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/method_call_expr.rast b/crates/parser/test_data/parser/inline/ok/method_call_expr.rast index 3245042cf245..ada62f0e472f 100644 --- a/crates/parser/test_data/parser/inline/ok/method_call_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/method_call_expr.rast @@ -1,39 +1,35 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT METHOD_CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] DOT "." NAME_REF IDENT "foo" ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT METHOD_CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "y" + IDENT "y" [WHITESPACE(" ")] [] DOT "." NAME_REF IDENT "bar" @@ -51,14 +47,12 @@ SOURCE_FILE L_PAREN "(" LITERAL INT_NUMBER "1" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" COMMA "," R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT METHOD_CALL_EXPR FIELD_EXPR @@ -67,7 +61,7 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] DOT "." NAME_REF INT_NUMBER "0" @@ -80,8 +74,7 @@ SOURCE_FILE ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT METHOD_CALL_EXPR FIELD_EXPR @@ -89,32 +82,29 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] DOT "." NAME_REF INT_NUMBER "0" - DOT "." - WHITESPACE " " + DOT "." [] [WHITESPACE(" ")] NAME_REF IDENT "call" ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] CALL_EXPR FIELD_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] DOT "." NAME_REF INT_NUMBER "0" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/mod_contents.rast b/crates/parser/test_data/parser/inline/ok/mod_contents.rast index 5f60e03d446e..37e985c57c56 100644 --- a/crates/parser/test_data/parser/inline/ok/mod_contents.rast +++ b/crates/parser/test_data/parser/inline/ok/mod_contents.rast @@ -1,29 +1,23 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] MACRO_RULES MACRO_RULES_KW "macro_rules" - BANG "!" - WHITESPACE " " + BANG "!" [] [WHITESPACE(" ")] NAME - IDENT "foo" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] TOKEN_TREE L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] MACRO_CALL PATH PATH @@ -38,8 +32,7 @@ SOURCE_FILE TOKEN_TREE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] MACRO_CALL PATH PATH @@ -50,16 +43,13 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "baz" - BANG "!" - WHITESPACE " " + BANG "!" [] [WHITESPACE(" ")] TOKEN_TREE L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/mod_item.rast b/crates/parser/test_data/parser/inline/ok/mod_item.rast index 4d505916cf65..ff1ce85bccac 100644 --- a/crates/parser/test_data/parser/inline/ok/mod_item.rast +++ b/crates/parser/test_data/parser/inline/ok/mod_item.rast @@ -1,8 +1,7 @@ SOURCE_FILE MODULE - MOD_KW "mod" - WHITESPACE " " + MOD_KW "mod" [] [WHITESPACE(" ")] NAME IDENT "a" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/mod_item_curly.rast b/crates/parser/test_data/parser/inline/ok/mod_item_curly.rast index d5e3f3493c39..2c2abd345e64 100644 --- a/crates/parser/test_data/parser/inline/ok/mod_item_curly.rast +++ b/crates/parser/test_data/parser/inline/ok/mod_item_curly.rast @@ -1,12 +1,9 @@ SOURCE_FILE MODULE - MOD_KW "mod" - WHITESPACE " " + MOD_KW "mod" [] [WHITESPACE(" ")] NAME - IDENT "b" - WHITESPACE " " + IDENT "b" [] [WHITESPACE(" ")] ITEM_LIST - L_CURLY "{" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/never_type.rast b/crates/parser/test_data/parser/inline/ok/never_type.rast index 53dbf3999b2a..8df5e9075b4e 100644 --- a/crates/parser/test_data/parser/inline/ok/never_type.rast +++ b/crates/parser/test_data/parser/inline/ok/never_type.rast @@ -1,13 +1,10 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "Never" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Never" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] NEVER_TYPE BANG "!" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/no_dyn_trait_leading_for.rast b/crates/parser/test_data/parser/inline/ok/no_dyn_trait_leading_for.rast index 6afa0613f399..08a60126e83a 100644 --- a/crates/parser/test_data/parser/inline/ok/no_dyn_trait_leading_for.rast +++ b/crates/parser/test_data/parser/inline/ok/no_dyn_trait_leading_for.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "A" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "A" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] DYN_TRAIT_TYPE TYPE_BOUND_LIST TYPE_BOUND @@ -18,8 +15,7 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -30,15 +26,13 @@ SOURCE_FILE LIFETIME_ARG LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Send" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/no_semi_after_block.rast b/crates/parser/test_data/parser/inline/ok/no_semi_after_block.rast index f89cc15e7210..8d5eb1f381b8 100644 --- a/crates/parser/test_data/parser/inline/ok/no_semi_after_block.rast +++ b/crates/parser/test_data/parser/inline/ok/no_semi_after_block.rast @@ -1,125 +1,96 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT LOOP_EXPR - LOOP_KW "loop" - WHITESPACE " " + LOOP_KW "loop" [WHITESPACE(" ")] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT WHILE_EXPR - WHILE_KW "while" - WHITESPACE " " + WHILE_KW "while" [WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT FOR_EXPR - FOR_KW "for" - WHITESPACE " " + FOR_KW "for" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - IN_KW "in" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + IN_KW "in" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR STMT_LIST - L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + L_CURLY "{" [WHITESPACE(" ")] [] + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR STMT_LIST - L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + L_CURLY "{" [WHITESPACE(" ")] [] + R_CURLY "}" [] [NEWLINE("\n")] MACRO_RULES - MACRO_RULES_KW "macro_rules" - BANG "!" - WHITESPACE " " + MACRO_RULES_KW "macro_rules" [WHITESPACE(" ")] [] + BANG "!" [] [WHITESPACE(" ")] NAME - IDENT "test" - WHITESPACE " " + IDENT "test" [] [WHITESPACE(" ")] TOKEN_TREE - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] TOKEN_TREE - L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + L_PAREN "(" [WHITESPACE(" ")] [] + R_PAREN ")" [] [WHITESPACE(" ")] EQ "=" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] TOKEN_TREE L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] MACRO_EXPR MACRO_CALL PATH PATH_SEGMENT NAME_REF - IDENT "test" + IDENT "test" [WHITESPACE(" ")] [] BANG "!" TOKEN_TREE L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/nocontentexpr.rast b/crates/parser/test_data/parser/inline/ok/nocontentexpr.rast index 8bd90a7f675a..98ebab758d49 100644 --- a/crates/parser/test_data/parser/inline/ok/nocontentexpr.rast +++ b/crates/parser/test_data/parser/inline/ok/nocontentexpr.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST @@ -9,9 +8,8 @@ SOURCE_FILE R_PAREN ")" BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " - SEMICOLON ";" + L_CURLY "{" [] [NEWLINE("\n")] + SEMICOLON ";" [WHITESPACE(" ")] [] SEMICOLON ";" SEMICOLON ";" EXPR_STMT @@ -51,7 +49,6 @@ SOURCE_FILE TUPLE_EXPR L_PAREN "(" R_PAREN ")" - R_PAREN ")" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/nocontentexpr_after_item.rast b/crates/parser/test_data/parser/inline/ok/nocontentexpr_after_item.rast index f5ee12fe9678..c26c2d53fd68 100644 --- a/crates/parser/test_data/parser/inline/ok/nocontentexpr_after_item.rast +++ b/crates/parser/test_data/parser/inline/ok/nocontentexpr_after_item.rast @@ -1,64 +1,49 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "simple_function" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] ENUM - ENUM_KW "enum" - WHITESPACE " " + ENUM_KW "enum" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME - IDENT "LocalEnum" - WHITESPACE " " + IDENT "LocalEnum" [] [WHITESPACE(" ")] VARIANT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] VARIANT NAME - IDENT "One" - COMMA "," - WHITESPACE "\n " + IDENT "One" [WHITESPACE(" ")] [] + COMMA "," [] [NEWLINE("\n")] VARIANT NAME - IDENT "Two" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + IDENT "Two" [WHITESPACE(" ")] [] + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_FIELD_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/non_isolated_self.rast b/crates/parser/test_data/parser/inline/ok/non_isolated_self.rast index fd4735452ba9..f9e2eaa2e161 100644 --- a/crates/parser/test_data/parser/inline/ok/non_isolated_self.rast +++ b/crates/parser/test_data/parser/inline/ok/non_isolated_self.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST @@ -17,23 +16,19 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "S" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "S" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "g" PARAM_LIST @@ -51,8 +46,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "S" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] REF_TYPE AMP "&" PATH_TYPE @@ -60,16 +54,13 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "S" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "h" PARAM_LIST @@ -77,8 +68,7 @@ SOURCE_FILE PARAM REF_PAT AMP "&" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_PAT PATH PATH @@ -89,21 +79,18 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "S" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] REF_TYPE AMP "&" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "S" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/not_null_pat.rast b/crates/parser/test_data/parser/inline/ok/not_null_pat.rast index 7a2e655201b6..c81c5a69e677 100644 --- a/crates/parser/test_data/parser/inline/ok/not_null_pat.rast +++ b/crates/parser/test_data/parser/inline/ok/not_null_pat.rast @@ -1,20 +1,16 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] PAREN_PAT L_PAREN "(" OR_PAT @@ -22,10 +18,8 @@ SOURCE_FILE BANG "!" IDENT_PAT NAME - IDENT "a" - WHITESPACE " " - PIPE "|" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + PIPE "|" [] [WHITESPACE(" ")] NOT_NULL BANG "!" REF_PAT @@ -33,14 +27,11 @@ SOURCE_FILE LITERAL_PAT LITERAL INT_NUMBER "0" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/offset_of_parens.rast b/crates/parser/test_data/parser/inline/ok/offset_of_parens.rast index 4e23455cfcc3..9ca0e6a54c05 100644 --- a/crates/parser/test_data/parser/inline/ok/offset_of_parens.rast +++ b/crates/parser/test_data/parser/inline/ok/offset_of_parens.rast @@ -1,20 +1,17 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT OFFSET_OF_EXPR - BUILTIN_KW "builtin" + BUILTIN_KW "builtin" [WHITESPACE(" ")] [] POUND "#" OFFSET_OF_KW "offset_of" L_PAREN "(" @@ -23,8 +20,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Foo" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] L_PAREN "(" NAME_REF IDENT "bar" @@ -36,7 +32,6 @@ SOURCE_FILE INT_NUMBER "0" R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/or_pattern.rast b/crates/parser/test_data/parser/inline/ok/or_pattern.rast index 6a2046d9e99e..4b9e73f778ff 100644 --- a/crates/parser/test_data/parser/inline/ok/or_pattern.rast +++ b/crates/parser/test_data/parser/inline/ok/or_pattern.rast @@ -1,112 +1,85 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM PAREN_PAT - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] OR_PAT WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - PIPE "|" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + PIPE "|" [] [WHITESPACE(" ")] WILDCARD_PAT UNDERSCORE "_" - R_PAREN ")" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM REF_PAT - AMP "&" + AMP "&" [WHITESPACE(" ")] [] PAREN_PAT L_PAREN "(" OR_PAT WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - PIPE "|" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + PIPE "|" [] [WHITESPACE(" ")] WILDCARD_PAT UNDERSCORE "_" - R_PAREN ")" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM TUPLE_PAT - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] OR_PAT WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - PIPE "|" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + PIPE "|" [] [WHITESPACE(" ")] WILDCARD_PAT UNDERSCORE "_" COMMA "," - R_PAREN ")" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM SLICE_PAT - L_BRACK "[" + L_BRACK "[" [WHITESPACE(" ")] [] OR_PAT WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - PIPE "|" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + PIPE "|" [] [WHITESPACE(" ")] WILDCARD_PAT UNDERSCORE "_" COMMA "," - R_BRACK "]" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/param_list.rast b/crates/parser/test_data/parser/inline/ok/param_list.rast index d240a52f6ff1..ed377138dc1f 100644 --- a/crates/parser/test_data/parser/inline/ok/param_list.rast +++ b/crates/parser/test_data/parser/inline/ok/param_list.rast @@ -1,21 +1,17 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "a" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "b" PARAM_LIST @@ -24,23 +20,19 @@ SOURCE_FILE IDENT_PAT NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "c" PARAM_LIST @@ -49,25 +41,20 @@ SOURCE_FILE IDENT_PAT NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - COMMA "," - WHITESPACE " " - R_PAREN ")" - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "d" PARAM_LIST @@ -76,28 +63,24 @@ SOURCE_FILE IDENT_PAT NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "y" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/param_list_vararg.rast b/crates/parser/test_data/parser/inline/ok/param_list_vararg.rast index 338d53995ae5..41ab33d3354a 100644 --- a/crates/parser/test_data/parser/inline/ok/param_list_vararg.rast +++ b/crates/parser/test_data/parser/inline/ok/param_list_vararg.rast @@ -1,16 +1,12 @@ SOURCE_FILE EXTERN_BLOCK ABI - EXTERN_KW "extern" - WHITESPACE " " - STRING "\"C\"" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + STRING "\"C\"" [] [WHITESPACE(" ")] EXTERN_ITEM_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "printf" PARAM_LIST @@ -19,44 +15,36 @@ SOURCE_FILE IDENT_PAT NAME IDENT "format" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i8" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM DOT3 "..." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u8" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/param_outer_arg.rast b/crates/parser/test_data/parser/inline/ok/param_outer_arg.rast index 7495ba7b31a2..f3990c64ff88 100644 --- a/crates/parser/test_data/parser/inline/ok/param_outer_arg.rast +++ b/crates/parser/test_data/parser/inline/ok/param_outer_arg.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST @@ -15,22 +14,19 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr1" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "pat" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Type" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/paren_type.rast b/crates/parser/test_data/parser/inline/ok/paren_type.rast index 29995bb752fc..d4cfc2136ccb 100644 --- a/crates/parser/test_data/parser/inline/ok/paren_type.rast +++ b/crates/parser/test_data/parser/inline/ok/paren_type.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PAREN_TYPE L_PAREN "(" PATH_TYPE @@ -15,5 +12,5 @@ SOURCE_FILE NAME_REF IDENT "i32" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/path_expr.rast b/crates/parser/test_data/parser/inline/ok/path_expr.rast index 48e123ab11b4..ba7bab23f45f 100644 --- a/crates/parser/test_data/parser/inline/ok/path_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/path_expr.rast @@ -1,40 +1,30 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "a" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH @@ -45,16 +35,12 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "b" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT @@ -71,16 +57,12 @@ SOURCE_FILE NAME_REF IDENT "b" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] MACRO_EXPR MACRO_CALL PATH @@ -91,7 +73,6 @@ SOURCE_FILE TOKEN_TREE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/path_fn_trait_args.rast b/crates/parser/test_data/parser/inline/ok/path_fn_trait_args.rast index 924f7ba2c9db..152262215c2b 100644 --- a/crates/parser/test_data/parser/inline/ok/path_fn_trait_args.rast +++ b/crates/parser/test_data/parser/inline/ok/path_fn_trait_args.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "F" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "F" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -28,25 +25,19 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "i32" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "F" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "F" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -69,25 +60,19 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "i32" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "F" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "F" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -110,25 +95,19 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "i32" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "F" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "F" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -152,14 +131,12 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "i32" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/path_part.rast b/crates/parser/test_data/parser/inline/ok/path_part.rast index 4ccda19a8d7d..51f58d14abb3 100644 --- a/crates/parser/test_data/parser/inline/ok/path_part.rast +++ b/crates/parser/test_data/parser/inline/ok/path_part.rast @@ -1,20 +1,16 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] PATH_PAT PATH PATH @@ -24,59 +20,44 @@ SOURCE_FILE COLON2 "::" PATH_SEGMENT NAME_REF - IDENT "Bar" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Bar" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] PATH_PAT PATH PATH_SEGMENT COLON2 "::" NAME_REF - IDENT "Bar" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Bar" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_PAT PATH PATH_SEGMENT NAME_REF - IDENT "Bar" - WHITESPACE " " + IDENT "Bar" [] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] REST_PAT - DOT2 ".." - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - EQ "=" - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_STRUCT_PAT PATH PATH_SEGMENT @@ -85,14 +66,11 @@ SOURCE_FILE L_PAREN "(" REST_PAT DOT2 ".." - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/path_type.rast b/crates/parser/test_data/parser/inline/ok/path_type.rast index d498d3721890..6c1908882442 100644 --- a/crates/parser/test_data/parser/inline/ok/path_type.rast +++ b/crates/parser/test_data/parser/inline/ok/path_type.rast @@ -1,43 +1,32 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "A" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "A" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Foo" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "B" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "B" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "Foo" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "C" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "C" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH @@ -48,16 +37,12 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Foo" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "D" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "D" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH @@ -68,5 +53,5 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Foo" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/path_type_with_bounds.rast b/crates/parser/test_data/parser/inline/ok/path_type_with_bounds.rast index a059e124ae42..2b10f02bb8fb 100644 --- a/crates/parser/test_data/parser/inline/ok/path_type_with_bounds.rast +++ b/crates/parser/test_data/parser/inline/ok/path_type_with_bounds.rast @@ -1,16 +1,13 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -26,32 +23,25 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "T" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND LIFETIME LIFETIME_IDENT "'f" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -61,25 +51,21 @@ SOURCE_FILE L_ANGLE "<" TYPE_ARG DYN_TRAIT_TYPE - DYN_KW "dyn" - WHITESPACE " " + DYN_KW "dyn" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "T" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND LIFETIME LIFETIME_IDENT "'f" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/pattern_type.rast b/crates/parser/test_data/parser/inline/ok/pattern_type.rast index c9caeb1f9b21..fb0be6bd4104 100644 --- a/crates/parser/test_data/parser/inline/ok/pattern_type.rast +++ b/crates/parser/test_data/parser/inline/ok/pattern_type.rast @@ -1,26 +1,20 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATTERN_TYPE BUILTIN_KW "builtin" POUND "#" - PATTERN_TYPE_KW "pattern_type" - WHITESPACE " " + PATTERN_TYPE_KW "pattern_type" [] [WHITESPACE(" ")] L_PAREN "(" PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u8" - WHITESPACE " " - IS_KW "is" - WHITESPACE " " + IDENT "u8" [] [WHITESPACE(" ")] + IS_KW "is" [] [WHITESPACE(" ")] RANGE_PAT LITERAL_PAT LITERAL @@ -30,5 +24,5 @@ SOURCE_FILE LITERAL INT_NUMBER "10" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/placeholder_pat.rast b/crates/parser/test_data/parser/inline/ok/placeholder_pat.rast index d39c3df2b7ef..91a1189e2216 100644 --- a/crates/parser/test_data/parser/inline/ok/placeholder_pat.rast +++ b/crates/parser/test_data/parser/inline/ok/placeholder_pat.rast @@ -1,29 +1,22 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/placeholder_type.rast b/crates/parser/test_data/parser/inline/ok/placeholder_type.rast index d9db1c34bf86..81cda4082aa1 100644 --- a/crates/parser/test_data/parser/inline/ok/placeholder_type.rast +++ b/crates/parser/test_data/parser/inline/ok/placeholder_type.rast @@ -1,13 +1,10 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "Placeholder" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Placeholder" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] INFER_TYPE UNDERSCORE "_" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/pointer_type_mut.rast b/crates/parser/test_data/parser/inline/ok/pointer_type_mut.rast index bfe7ed5b4003..f24d33a575e4 100644 --- a/crates/parser/test_data/parser/inline/ok/pointer_type_mut.rast +++ b/crates/parser/test_data/parser/inline/ok/pointer_type_mut.rast @@ -1,35 +1,26 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "M" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "M" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "C" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "C" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/postfix_range.rast b/crates/parser/test_data/parser/inline/ok/postfix_range.rast index 3a59cf7b8325..f9ab6ee7e189 100644 --- a/crates/parser/test_data/parser/inline/ok/postfix_range.rast +++ b/crates/parser/test_data/parser/inline/ok/postfix_range.rast @@ -1,61 +1,46 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "x" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] RANGE_EXPR LITERAL INT_NUMBER "1" DOT2 ".." - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] RANGE_EXPR LITERAL INT_NUMBER "1" - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] RANGE_EXPR METHOD_CALL_EXPR PATH_EXPR @@ -74,23 +59,17 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/precise_capturing.rast b/crates/parser/test_data/parser/inline/ok/precise_capturing.rast index 5a67cc21766c..9ac52832206e 100644 --- a/crates/parser/test_data/parser/inline/ok/precise_capturing.rast +++ b/crates/parser/test_data/parser/inline/ok/precise_capturing.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "captures" GENERIC_PARAM_LIST @@ -9,67 +8,55 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME LIFETIME_IDENT "'a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'b" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME LIFETIME_IDENT "'b" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_PARAM NAME IDENT "T" R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] IMPL_TRAIT_TYPE - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Sized" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "Sized" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND USE_KW "use" USE_BOUND_GENERIC_ARGS L_ANGLE "<" LIFETIME LIFETIME_IDENT "'b" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] NAME_REF IDENT "T" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] NAME_REF SELF_TYPE_KW "Self" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/pub_parens_typepath.rast b/crates/parser/test_data/parser/inline/ok/pub_parens_typepath.rast index 2dede8359872..9db29cfeb089 100644 --- a/crates/parser/test_data/parser/inline/ok/pub_parens_typepath.rast +++ b/crates/parser/test_data/parser/inline/ok/pub_parens_typepath.rast @@ -1,15 +1,13 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "B" TUPLE_FIELD_LIST L_PAREN "(" TUPLE_FIELD VISIBILITY - PUB_KW "pub" - WHITESPACE " " + PUB_KW "pub" [] [WHITESPACE(" ")] PAREN_TYPE L_PAREN "(" PATH_TYPE @@ -24,19 +22,16 @@ SOURCE_FILE IDENT "A" R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "B" TUPLE_FIELD_LIST L_PAREN "(" TUPLE_FIELD VISIBILITY - PUB_KW "pub" - WHITESPACE " " + PUB_KW "pub" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" PATH_TYPE @@ -52,5 +47,5 @@ SOURCE_FILE COMMA "," R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/pub_tuple_field.rast b/crates/parser/test_data/parser/inline/ok/pub_tuple_field.rast index c78d16f064c4..3bfddafadd47 100644 --- a/crates/parser/test_data/parser/inline/ok/pub_tuple_field.rast +++ b/crates/parser/test_data/parser/inline/ok/pub_tuple_field.rast @@ -1,15 +1,13 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "MyStruct" TUPLE_FIELD_LIST L_PAREN "(" TUPLE_FIELD VISIBILITY - PUB_KW "pub" - WHITESPACE " " + PUB_KW "pub" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" PATH_TYPE @@ -17,8 +15,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "u32" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -26,19 +23,16 @@ SOURCE_FILE IDENT "u32" R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "MyStruct" TUPLE_FIELD_LIST L_PAREN "(" TUPLE_FIELD VISIBILITY - PUB_KW "pub" - WHITESPACE " " + PUB_KW "pub" [] [WHITESPACE(" ")] PAREN_TYPE L_PAREN "(" PATH_TYPE @@ -48,22 +42,19 @@ SOURCE_FILE IDENT "u32" R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "MyStruct" TUPLE_FIELD_LIST L_PAREN "(" TUPLE_FIELD VISIBILITY - PUB_KW "pub" - WHITESPACE " " + PUB_KW "pub" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/qual_paths.rast b/crates/parser/test_data/parser/inline/ok/qual_paths.rast index 10f8a6a75165..15ee5f779593 100644 --- a/crates/parser/test_data/parser/inline/ok/qual_paths.rast +++ b/crates/parser/test_data/parser/inline/ok/qual_paths.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "X" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "X" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH @@ -17,10 +14,8 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "A" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + IDENT "A" [] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -31,21 +26,17 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Output" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT CALL_EXPR PATH_EXPR @@ -58,10 +49,8 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "usize" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + IDENT "usize" [] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -75,7 +64,6 @@ SOURCE_FILE ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/question_for_type_trait_bound.rast b/crates/parser/test_data/parser/inline/ok/question_for_type_trait_bound.rast index 69db1aee2c5a..7b5ad87666ee 100644 --- a/crates/parser/test_data/parser/inline/ok/question_for_type_trait_bound.rast +++ b/crates/parser/test_data/parser/inline/ok/question_for_type_trait_bound.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" GENERIC_PARAM_LIST @@ -12,36 +11,31 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE " " + WHERE_KW "where" [] [WHITESPACE(" ")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND FOR_BINDER FOR_KW "for" GENERIC_PARAM_LIST L_ANGLE "<" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] QUESTION "?" PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Sized" - WHITESPACE " " + IDENT "Sized" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/range_pat.rast b/crates/parser/test_data/parser/inline/ok/range_pat.rast index ba0198e9d542..41b93f5b5816 100644 --- a/crates/parser/test_data/parser/inline/ok/range_pat.rast +++ b/crates/parser/test_data/parser/inline/ok/range_pat.rast @@ -1,191 +1,145 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM PAREN_PAT - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] RANGE_PAT DOT2 ".." LITERAL_PAT LITERAL INT_NUMBER "1" - R_PAREN ")" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM PAREN_PAT - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] RANGE_PAT DOT2EQ "..=" LITERAL_PAT LITERAL INT_NUMBER "3" - R_PAREN ")" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM PAREN_PAT - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] OR_PAT RANGE_PAT DOT2 ".." LITERAL_PAT LITERAL - INT_NUMBER "2" - WHITESPACE " " - PIPE "|" - WHITESPACE " " + INT_NUMBER "2" [] [WHITESPACE(" ")] + PIPE "|" [] [WHITESPACE(" ")] LITERAL_PAT LITERAL INT_NUMBER "4" - R_PAREN ")" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL - INT_NUMBER "92" - WHITESPACE " " + INT_NUMBER "92" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM RANGE_PAT LITERAL_PAT LITERAL - INT_NUMBER "0" - WHITESPACE " " - DOT3 "..." - WHITESPACE " " + INT_NUMBER "0" [WHITESPACE(" ")] [WHITESPACE(" ")] + DOT3 "..." [] [WHITESPACE(" ")] LITERAL_PAT LITERAL - INT_NUMBER "100" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + INT_NUMBER "100" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM RANGE_PAT LITERAL_PAT LITERAL - INT_NUMBER "101" - WHITESPACE " " - DOT2EQ "..=" - WHITESPACE " " + INT_NUMBER "101" [WHITESPACE(" ")] [WHITESPACE(" ")] + DOT2EQ "..=" [] [WHITESPACE(" ")] LITERAL_PAT LITERAL - INT_NUMBER "200" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + INT_NUMBER "200" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM RANGE_PAT LITERAL_PAT LITERAL - INT_NUMBER "200" - WHITESPACE " " - DOT2 ".." - WHITESPACE " " + INT_NUMBER "200" [WHITESPACE(" ")] [WHITESPACE(" ")] + DOT2 ".." [] [WHITESPACE(" ")] LITERAL_PAT LITERAL - INT_NUMBER "301" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + INT_NUMBER "301" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM RANGE_PAT LITERAL_PAT LITERAL - INT_NUMBER "302" - WHITESPACE " " - DOT2 ".." - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + INT_NUMBER "302" [WHITESPACE(" ")] [WHITESPACE(" ")] + DOT2 ".." [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM RANGE_PAT - DOT2EQ "..=" - WHITESPACE " " + DOT2EQ "..=" [WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL_PAT LITERAL - INT_NUMBER "303" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + INT_NUMBER "303" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -196,349 +150,274 @@ SOURCE_FILE L_PAREN "(" CAST_EXPR LITERAL - INT_NUMBER "10" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + INT_NUMBER "10" [] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u8" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM OR_PAT TUPLE_STRUCT_PAT PATH PATH_SEGMENT NAME_REF - IDENT "Some" + IDENT "Some" [WHITESPACE(" ")] [] L_PAREN "(" LITERAL_PAT LITERAL INT_NUMBER "0" - R_PAREN ")" - WHITESPACE " " - PIPE "|" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + PIPE "|" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "None" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + IDENT "None" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM TUPLE_STRUCT_PAT PATH PATH_SEGMENT NAME_REF - IDENT "Some" + IDENT "Some" [WHITESPACE(" ")] [] L_PAREN "(" RANGE_PAT LITERAL_PAT LITERAL INT_NUMBER "1" DOT2 ".." - R_PAREN ")" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM TUPLE_STRUCT_PAT PATH PATH_SEGMENT NAME_REF - IDENT "Some" + IDENT "Some" [WHITESPACE(" ")] [] L_PAREN "(" RANGE_PAT DOT2EQ "..=" LITERAL_PAT LITERAL INT_NUMBER "2" - R_PAREN ")" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM RECORD_PAT PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_PAT_FIELD NAME_REF IDENT "a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] LITERAL_PAT LITERAL - INT_NUMBER "0" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + INT_NUMBER "0" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM RECORD_PAT PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_PAT_FIELD NAME_REF IDENT "a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] RANGE_PAT LITERAL_PAT LITERAL INT_NUMBER "1" - DOT2 ".." - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM RECORD_PAT PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_PAT_FIELD NAME_REF IDENT "a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] RANGE_PAT DOT2EQ "..=" LITERAL_PAT LITERAL - INT_NUMBER "2" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + INT_NUMBER "2" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM SLICE_PAT - L_BRACK "[" + L_BRACK "[" [WHITESPACE(" ")] [] LITERAL_PAT LITERAL INT_NUMBER "0" - R_BRACK "]" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM SLICE_PAT - L_BRACK "[" + L_BRACK "[" [WHITESPACE(" ")] [] RANGE_PAT LITERAL_PAT LITERAL INT_NUMBER "1" DOT2 ".." - R_BRACK "]" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM SLICE_PAT - L_BRACK "[" + L_BRACK "[" [WHITESPACE(" ")] [] RANGE_PAT DOT2EQ "..=" LITERAL_PAT LITERAL INT_NUMBER "2" - R_BRACK "]" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" CAST_EXPR LITERAL - INT_NUMBER "10" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + INT_NUMBER "10" [] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u8" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] CAST_EXPR LITERAL - INT_NUMBER "5" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + INT_NUMBER "5" [] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u8" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM TUPLE_PAT - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] LITERAL_PAT LITERAL INT_NUMBER "0" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] WILDCARD_PAT UNDERSCORE "_" - R_PAREN ")" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM TUPLE_PAT - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] RANGE_PAT LITERAL_PAT LITERAL INT_NUMBER "1" DOT2 ".." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] WILDCARD_PAT UNDERSCORE "_" - R_PAREN ")" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM TUPLE_PAT - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] RANGE_PAT DOT2EQ "..=" LITERAL_PAT LITERAL INT_NUMBER "2" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] WILDCARD_PAT UNDERSCORE "_" - R_PAREN ")" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n" - R_CURLY "}" - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [NEWLINE("\n")] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/record_field_attrs.rast b/crates/parser/test_data/parser/inline/ok/record_field_attrs.rast index cfa2694fd1de..220945c593c6 100644 --- a/crates/parser/test_data/parser/inline/ok/record_field_attrs.rast +++ b/crates/parser/test_data/parser/inline/ok/record_field_attrs.rast @@ -1,13 +1,10 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_FIELD ATTR POUND "#" @@ -17,17 +14,14 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] NAME IDENT "f" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "f32" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + IDENT "f32" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/record_field_default_values.rast b/crates/parser/test_data/parser/inline/ok/record_field_default_values.rast index e53b886bbff8..8cfda418cbcc 100644 --- a/crates/parser/test_data/parser/inline/ok/record_field_default_values.rast +++ b/crates/parser/test_data/parser/inline/ok/record_field_default_values.rast @@ -1,29 +1,22 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_FIELD NAME IDENT "f" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "f32" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "f32" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CONST_ARG LITERAL - FLOAT_NUMBER "0.0" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + FLOAT_NUMBER "0.0" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/record_field_list.rast b/crates/parser/test_data/parser/inline/ok/record_field_list.rast index 07686f509c1b..10efcc9753b7 100644 --- a/crates/parser/test_data/parser/inline/ok/record_field_list.rast +++ b/crates/parser/test_data/parser/inline/ok/record_field_list.rast @@ -1,49 +1,39 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_FIELD NAME IDENT "a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] RECORD_FIELD NAME IDENT "b" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "f32" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] RECORD_FIELD - UNSAFE_KW "unsafe" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] NAME IDENT "c" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u8" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + IDENT "u8" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/record_field_pat_leading_or.rast b/crates/parser/test_data/parser/inline/ok/record_field_pat_leading_or.rast index 4ef6c1c45f5b..2c6a1f674db8 100644 --- a/crates/parser/test_data/parser/inline/ok/record_field_pat_leading_or.rast +++ b/crates/parser/test_data/parser/inline/ok/record_field_pat_leading_or.rast @@ -1,54 +1,40 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] RECORD_PAT PATH PATH_SEGMENT NAME_REF - IDENT "R" - WHITESPACE " " + IDENT "R" [] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_PAT_FIELD NAME_REF IDENT "a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] OR_PAT - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] LITERAL_PAT LITERAL - INT_NUMBER "1" - WHITESPACE " " - PIPE "|" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + PIPE "|" [] [WHITESPACE(" ")] LITERAL_PAT LITERAL - INT_NUMBER "2" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - EQ "=" - WHITESPACE " " + INT_NUMBER "2" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/record_lit.rast b/crates/parser/test_data/parser/inline/ok/record_lit.rast index b868da55bcea..eda9ada00e66 100644 --- a/crates/parser/test_data/parser/inline/ok/record_lit.rast +++ b/crates/parser/test_data/parser/inline/ok/record_lit.rast @@ -1,106 +1,86 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "x" - WHITESPACE " " + IDENT "x" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "x" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] RECORD_EXPR_FIELD NAME_REF IDENT "y" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "32" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "x" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] RECORD_EXPR_FIELD NAME_REF IDENT "y" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "32" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] DOT2 ".." CALL_EXPR PATH_EXPR @@ -115,73 +95,57 @@ SOURCE_FILE IDENT "default" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "x" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] RECORD_EXPR_FIELD NAME_REF IDENT "y" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "32" - COMMA "," - WHITESPACE " " - DOT2 ".." - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] + DOT2 ".." [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " - DOT2 ".." - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] + DOT2 ".." [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD NAME_REF IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -191,31 +155,24 @@ SOURCE_FILE IDENT "default" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "TupleStruct" - WHITESPACE " " + IDENT "TupleStruct" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD NAME_REF INT_NUMBER "0" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "1" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/record_literal_field_with_attr.rast b/crates/parser/test_data/parser/inline/ok/record_literal_field_with_attr.rast index 717dee8c9f39..c77ea2760b70 100644 --- a/crates/parser/test_data/parser/inline/ok/record_literal_field_with_attr.rast +++ b/crates/parser/test_data/parser/inline/ok/record_literal_field_with_attr.rast @@ -1,26 +1,21 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD ATTR POUND "#" @@ -31,16 +26,12 @@ SOURCE_FILE CFG_ATOM IDENT "test" R_PAREN ")" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] NAME_REF IDENT "field" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "1" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + INT_NUMBER "1" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/record_mut_restrictions_after.rast b/crates/parser/test_data/parser/inline/ok/record_mut_restrictions_after.rast index ebe3c8146832..f0ed533ddaf1 100644 --- a/crates/parser/test_data/parser/inline/ok/record_mut_restrictions_after.rast +++ b/crates/parser/test_data/parser/inline/ok/record_mut_restrictions_after.rast @@ -1,16 +1,12 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_FIELD - UNSAFE_KW "unsafe" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] MUT_RESTRICTION MUT_KW "mut" VISIBILITY_INNER @@ -19,17 +15,14 @@ SOURCE_FILE PATH_SEGMENT NAME_REF SUPER_KW "super" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] NAME IDENT "i" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + IDENT "i32" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/record_mut_restrictions_before.rast b/crates/parser/test_data/parser/inline/ok/record_mut_restrictions_before.rast index 7f76e737f7ee..ac183d3d3da8 100644 --- a/crates/parser/test_data/parser/inline/ok/record_mut_restrictions_before.rast +++ b/crates/parser/test_data/parser/inline/ok/record_mut_restrictions_before.rast @@ -1,13 +1,10 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_FIELD MUT_RESTRICTION MUT_KW "mut" @@ -17,19 +14,15 @@ SOURCE_FILE PATH_SEGMENT NAME_REF SUPER_KW "super" - R_PAREN ")" - WHITESPACE " " - UNSAFE_KW "unsafe" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] NAME IDENT "i" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + IDENT "i32" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/record_pat_field.rast b/crates/parser/test_data/parser/inline/ok/record_pat_field.rast index 7fba529be9e9..d86fdc693b55 100644 --- a/crates/parser/test_data/parser/inline/ok/record_pat_field.rast +++ b/crates/parser/test_data/parser/inline/ok/record_pat_field.rast @@ -1,89 +1,67 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_PAT PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_PAT_FIELD NAME_REF INT_NUMBER "0" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] LITERAL_PAT LITERAL - INT_NUMBER "1" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - EQ "=" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_PAT PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_PAT_FIELD NAME_REF IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] LITERAL_PAT LITERAL - INT_NUMBER "1" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - EQ "=" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_PAT PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_PAT_FIELD ATTR POUND "#" @@ -96,24 +74,18 @@ SOURCE_FILE L_PAREN "(" R_PAREN ")" R_PAREN ")" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] NAME_REF IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] LITERAL_PAT LITERAL - INT_NUMBER "1" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - EQ "=" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/record_pat_field_list.rast b/crates/parser/test_data/parser/inline/ok/record_pat_field_list.rast index af5b82b889d3..868fa0ceaaf2 100644 --- a/crates/parser/test_data/parser/inline/ok/record_pat_field_list.rast +++ b/crates/parser/test_data/parser/inline/ok/record_pat_field_list.rast @@ -1,147 +1,110 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_PAT PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_CURLY "}" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_PAT PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_PAT_FIELD IDENT_PAT NAME IDENT "f" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] RECORD_PAT_FIELD IDENT_PAT - REF_KW "ref" - WHITESPACE " " - MUT_KW "mut" - WHITESPACE " " + REF_KW "ref" [] [WHITESPACE(" ")] + MUT_KW "mut" [] [WHITESPACE(" ")] NAME - IDENT "g" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "g" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_PAT PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_PAT_FIELD NAME_REF IDENT "h" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] WILDCARD_PAT UNDERSCORE "_" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - R_CURLY "}" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_CURLY "}" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_PAT PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_PAT_FIELD NAME_REF IDENT "h" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] WILDCARD_PAT UNDERSCORE "_" - COMMA "," - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - EQ "=" - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_PAT PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] REST_PAT ATTR POUND "#" @@ -154,18 +117,13 @@ SOURCE_FILE L_PAREN "(" R_PAREN ")" R_PAREN ")" - R_BRACK "]" - WHITESPACE " " - DOT2 ".." - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + DOT2 ".." [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/ref_expr.rast b/crates/parser/test_data/parser/inline/ok/ref_expr.rast index 8dc916e5cc54..1b9b408d9444 100644 --- a/crates/parser/test_data/parser/inline/ok/ref_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/ref_expr.rast @@ -1,45 +1,32 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " - COMMENT "// reference operator" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" "), COMMENT("// reference operator"), NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_EXPR AMP "&" LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_EXPR AMP "&" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] REF_EXPR AMP "&" CALL_EXPR @@ -51,16 +38,12 @@ SOURCE_FILE ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_EXPR AMP "&" PATH_EXPR @@ -68,16 +51,12 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "raw" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_EXPR AMP "&" FIELD_EXPR @@ -89,70 +68,50 @@ SOURCE_FILE DOT "." NAME_REF INT_NUMBER "0" - SEMICOLON ";" - WHITESPACE "\n " - COMMENT "// raw reference operator" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" "), COMMENT("// raw reference operator"), NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_EXPR AMP "&" - RAW_KW "raw" - WHITESPACE " " - MUT_KW "mut" - WHITESPACE " " + RAW_KW "raw" [] [WHITESPACE(" ")] + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "foo" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_EXPR AMP "&" - RAW_KW "raw" - WHITESPACE " " - CONST_KW "const" - WHITESPACE " " + RAW_KW "raw" [] [WHITESPACE(" ")] + CONST_KW "const" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "foo" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_EXPR AMP "&" - RAW_KW "raw" - WHITESPACE " " + RAW_KW "raw" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "foo" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/ref_pat.rast b/crates/parser/test_data/parser/inline/ok/ref_pat.rast index 4516fd011327..a8eae35f1c61 100644 --- a/crates/parser/test_data/parser/inline/ok/ref_pat.rast +++ b/crates/parser/test_data/parser/inline/ok/ref_pat.rast @@ -1,50 +1,38 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] REF_PAT AMP "&" IDENT_PAT NAME - IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] REF_PAT AMP "&" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "b" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "b" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/reference_type.rast b/crates/parser/test_data/parser/inline/ok/reference_type.rast index b5c9d7a8dfb3..4bb1d53fbee7 100644 --- a/crates/parser/test_data/parser/inline/ok/reference_type.rast +++ b/crates/parser/test_data/parser/inline/ok/reference_type.rast @@ -1,51 +1,38 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "A" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "A" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_TYPE AMP "&" TUPLE_TYPE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "B" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "B" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'static" - WHITESPACE " " + LIFETIME_IDENT "'static" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "C" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "C" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_TYPE AMP "&" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/return_attr.rast b/crates/parser/test_data/parser/inline/ok/return_attr.rast index d5dcdf04479e..1b25d6701783 100644 --- a/crates/parser/test_data/parser/inline/ok/return_attr.rast +++ b/crates/parser/test_data/parser/inline/ok/return_attr.rast @@ -1,21 +1,17 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RETURN_EXPR - RETURN_KW "return" - WHITESPACE " " + RETURN_KW "return" [WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL ATTR POUND "#" @@ -25,10 +21,8 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/return_expr.rast b/crates/parser/test_data/parser/inline/ok/return_expr.rast index 62cff1220266..6f6b9c95c93d 100644 --- a/crates/parser/test_data/parser/inline/ok/return_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/return_expr.rast @@ -1,29 +1,23 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RETURN_EXPR - RETURN_KW "return" - SEMICOLON ";" - WHITESPACE "\n " + RETURN_KW "return" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT RETURN_EXPR - RETURN_KW "return" - WHITESPACE " " + RETURN_KW "return" [WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL INT_NUMBER "92" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/return_type_syntax_in_path.rast b/crates/parser/test_data/parser/inline/ok/return_type_syntax_in_path.rast index 15a0558b53d4..a597dabffca6 100644 --- a/crates/parser/test_data/parser/inline/ok/return_type_syntax_in_path.rast +++ b/crates/parser/test_data/parser/inline/ok/return_type_syntax_in_path.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" GENERIC_PARAM_LIST @@ -12,18 +11,16 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE "\n " + WHERE_KW "where" [] [NEWLINE("\n")] WHERE_PRED PATH_TYPE PATH PATH PATH_SEGMENT NAME_REF - IDENT "T" + IDENT "T" [WHITESPACE(" ")] [] COLON2 "::" PATH_SEGMENT NAME_REF @@ -32,8 +29,7 @@ SOURCE_FILE L_PAREN "(" DOT2 ".." R_PAREN ")" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -41,20 +37,18 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Send" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "method" + IDENT "method" [WHITESPACE(" ")] [] RETURN_TYPE_SYNTAX L_PAREN "(" DOT2 ".." R_PAREN ")" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -62,21 +56,19 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Send" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "method" + IDENT "method" [WHITESPACE(" ")] [] RETURN_TYPE_SYNTAX COLON2 "::" L_PAREN "(" DOT2 ".." R_PAREN ")" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -84,10 +76,9 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Send" - COMMA "," - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/safe_outside_of_extern.rast b/crates/parser/test_data/parser/inline/ok/safe_outside_of_extern.rast index c9398eaa9937..73ccf39bf5bb 100644 --- a/crates/parser/test_data/parser/inline/ok/safe_outside_of_extern.rast +++ b/crates/parser/test_data/parser/inline/ok/safe_outside_of_extern.rast @@ -1,30 +1,24 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "safe" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "safe" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL TRUE_KW "true" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/self_param.rast b/crates/parser/test_data/parser/inline/ok/self_param.rast index 67e28236397f..40ac5e2dbd4e 100644 --- a/crates/parser/test_data/parser/inline/ok/self_param.rast +++ b/crates/parser/test_data/parser/inline/ok/self_param.rast @@ -1,19 +1,15 @@ SOURCE_FILE IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "a" PARAM_LIST @@ -21,16 +17,13 @@ SOURCE_FILE SELF_PARAM NAME SELF_KW "self" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "b" PARAM_LIST @@ -40,16 +33,13 @@ SOURCE_FILE NAME SELF_KW "self" COMMA "," - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "c" PARAM_LIST @@ -57,21 +47,17 @@ SOURCE_FILE SELF_PARAM AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] NAME SELF_KW "self" COMMA "," - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "d" PARAM_LIST @@ -79,50 +65,40 @@ SOURCE_FILE SELF_PARAM AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " - MUT_KW "mut" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] + MUT_KW "mut" [] [WHITESPACE(" ")] NAME SELF_KW "self" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "e" PARAM_LIST L_PAREN "(" SELF_PARAM - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] NAME SELF_KW "self" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/self_param_outer_attr.rast b/crates/parser/test_data/parser/inline/ok/self_param_outer_attr.rast index 3a163e5b8ee7..d3cae53c04b8 100644 --- a/crates/parser/test_data/parser/inline/ok/self_param_outer_attr.rast +++ b/crates/parser/test_data/parser/inline/ok/self_param_outer_attr.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST @@ -15,14 +14,12 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "must_use" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] NAME SELF_KW "self" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/singleton_tuple_type.rast b/crates/parser/test_data/parser/inline/ok/singleton_tuple_type.rast index 0129955d1363..71a23fa661d3 100644 --- a/crates/parser/test_data/parser/inline/ok/singleton_tuple_type.rast +++ b/crates/parser/test_data/parser/inline/ok/singleton_tuple_type.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" PATH_TYPE @@ -16,5 +13,5 @@ SOURCE_FILE IDENT "i32" COMMA "," R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/slice_pat.rast b/crates/parser/test_data/parser/inline/ok/slice_pat.rast index 06c30bba59f6..f70ff819928d 100644 --- a/crates/parser/test_data/parser/inline/ok/slice_pat.rast +++ b/crates/parser/test_data/parser/inline/ok/slice_pat.rast @@ -1,66 +1,51 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] SLICE_PAT L_BRACK "[" IDENT_PAT NAME IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "b" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - R_BRACK "]" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] ARRAY_EXPR L_BRACK "[" R_BRACK "]" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] SLICE_PAT L_BRACK "[" OR_PAT - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - R_BRACK "]" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] ARRAY_EXPR L_BRACK "[" R_BRACK "]" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/slice_type.rast b/crates/parser/test_data/parser/inline/ok/slice_type.rast index 0bcb31524819..ed856a66fb7d 100644 --- a/crates/parser/test_data/parser/inline/ok/slice_type.rast +++ b/crates/parser/test_data/parser/inline/ok/slice_type.rast @@ -1,17 +1,14 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] SLICE_TYPE L_BRACK "[" TUPLE_TYPE L_PAREN "(" R_PAREN ")" R_BRACK "]" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/stmt_bin_expr_ambiguity.rast b/crates/parser/test_data/parser/inline/ok/stmt_bin_expr_ambiguity.rast index e387e14d14fa..a4e93b1d4abf 100644 --- a/crates/parser/test_data/parser/inline/ok/stmt_bin_expr_ambiguity.rast +++ b/crates/parser/test_data/parser/inline/ok/stmt_bin_expr_ambiguity.rast @@ -1,53 +1,42 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR BLOCK_EXPR STMT_LIST L_CURLY "{" LITERAL INT_NUMBER "1" - R_CURLY "}" - WHITESPACE " " - AMP "&" - WHITESPACE " " + R_CURLY "}" [] [WHITESPACE(" ")] + AMP "&" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR STMT_LIST - L_CURLY "{" + L_CURLY "{" [WHITESPACE(" ")] [] LITERAL INT_NUMBER "1" - R_CURLY "}" - WHITESPACE " " + R_CURLY "}" [] [WHITESPACE(" ")] EXPR_STMT REF_EXPR AMP "&" LITERAL INT_NUMBER "2" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/stmt_postfix_expr_ambiguity.rast b/crates/parser/test_data/parser/inline/ok/stmt_postfix_expr_ambiguity.rast index 950421feb70b..95109641390d 100644 --- a/crates/parser/test_data/parser/inline/ok/stmt_postfix_expr_ambiguity.rast +++ b/crates/parser/test_data/parser/inline/ok/stmt_postfix_expr_ambiguity.rast @@ -1,63 +1,47 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] MATCH_ARM TUPLE_PAT - L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + L_PAREN "(" [WHITESPACE(" ")] [] + R_PAREN ")" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] MATCH_ARM SLICE_PAT - L_BRACK "[" - R_BRACK "]" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + L_BRACK "[" [WHITESPACE(" ")] [] + R_BRACK "]" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/struct_initializer_with_defaults.rast b/crates/parser/test_data/parser/inline/ok/struct_initializer_with_defaults.rast index 987e219ae822..39c92fda1db8 100644 --- a/crates/parser/test_data/parser/inline/ok/struct_initializer_with_defaults.rast +++ b/crates/parser/test_data/parser/inline/ok/struct_initializer_with_defaults.rast @@ -1,39 +1,29 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "_s" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "_s" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " - DOT2 ".." - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] + DOT2 ".." [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/struct_item.rast b/crates/parser/test_data/parser/inline/ok/struct_item.rast index 78f96820723f..03d00d83f040 100644 --- a/crates/parser/test_data/parser/inline/ok/struct_item.rast +++ b/crates/parser/test_data/parser/inline/ok/struct_item.rast @@ -1,11 +1,9 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_FIELD_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/trait_alias.rast b/crates/parser/test_data/parser/inline/ok/trait_alias.rast index 2ef66484ae48..27ed87dfedb2 100644 --- a/crates/parser/test_data/parser/inline/ok/trait_alias.rast +++ b/crates/parser/test_data/parser/inline/ok/trait_alias.rast @@ -1,7 +1,6 @@ SOURCE_FILE TRAIT - TRAIT_KW "trait" - WHITESPACE " " + TRAIT_KW "trait" [] [WHITESPACE(" ")] NAME IDENT "Z" GENERIC_PARAM_LIST @@ -9,10 +8,8 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "U" - R_ANGLE ">" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -29,5 +26,5 @@ SOURCE_FILE NAME_REF IDENT "U" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/trait_alias_where_clause.rast b/crates/parser/test_data/parser/inline/ok/trait_alias_where_clause.rast index 4443d9d14263..073680eeb8a8 100644 --- a/crates/parser/test_data/parser/inline/ok/trait_alias_where_clause.rast +++ b/crates/parser/test_data/parser/inline/ok/trait_alias_where_clause.rast @@ -1,7 +1,6 @@ SOURCE_FILE TRAIT - TRAIT_KW "trait" - WHITESPACE " " + TRAIT_KW "trait" [] [WHITESPACE(" ")] NAME IDENT "Z" GENERIC_PARAM_LIST @@ -9,10 +8,8 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "U" - R_ANGLE ">" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -28,19 +25,16 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "U" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE " " + WHERE_KW "where" [] [WHITESPACE(" ")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "U" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -48,11 +42,9 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Copy" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TRAIT - TRAIT_KW "trait" - WHITESPACE " " + TRAIT_KW "trait" [] [WHITESPACE(" ")] NAME IDENT "Z" GENERIC_PARAM_LIST @@ -60,22 +52,18 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "U" - R_ANGLE ">" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TYPE_BOUND_LIST WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE " " + WHERE_KW "where" [] [WHITESPACE(" ")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF SELF_TYPE_KW "Self" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -92,5 +80,5 @@ SOURCE_FILE NAME_REF IDENT "U" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/trait_item.rast b/crates/parser/test_data/parser/inline/ok/trait_item.rast index dd7f76eb9397..704da073fd6b 100644 --- a/crates/parser/test_data/parser/inline/ok/trait_item.rast +++ b/crates/parser/test_data/parser/inline/ok/trait_item.rast @@ -1,31 +1,24 @@ SOURCE_FILE TRAIT - TRAIT_KW "trait" - WHITESPACE " " + TRAIT_KW "trait" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "new" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF SELF_TYPE_KW "Self" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/trait_item_bounds.rast b/crates/parser/test_data/parser/inline/ok/trait_item_bounds.rast index bab831456221..7ebc0b0cdfe6 100644 --- a/crates/parser/test_data/parser/inline/ok/trait_item_bounds.rast +++ b/crates/parser/test_data/parser/inline/ok/trait_item_bounds.rast @@ -1,29 +1,24 @@ SOURCE_FILE TRAIT - TRAIT_KW "trait" - WHITESPACE " " + TRAIT_KW "trait" [] [WHITESPACE(" ")] NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Hash" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "Hash" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Clone" - WHITESPACE " " + IDENT "Clone" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/trait_item_generic_params.rast b/crates/parser/test_data/parser/inline/ok/trait_item_generic_params.rast index 01f212e71848..8a82f93e8191 100644 --- a/crates/parser/test_data/parser/inline/ok/trait_item_generic_params.rast +++ b/crates/parser/test_data/parser/inline/ok/trait_item_generic_params.rast @@ -1,7 +1,6 @@ SOURCE_FILE TRAIT - TRAIT_KW "trait" - WHITESPACE " " + TRAIT_KW "trait" [] [WHITESPACE(" ")] NAME IDENT "X" GENERIC_PARAM_LIST @@ -9,27 +8,23 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "U" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Debug" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "Debug" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Display" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/trait_item_where_clause.rast b/crates/parser/test_data/parser/inline/ok/trait_item_where_clause.rast index 46cd8ee66545..855d0c722328 100644 --- a/crates/parser/test_data/parser/inline/ok/trait_item_where_clause.rast +++ b/crates/parser/test_data/parser/inline/ok/trait_item_where_clause.rast @@ -1,30 +1,25 @@ SOURCE_FILE TRAIT - TRAIT_KW "trait" - WHITESPACE " " + TRAIT_KW "trait" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE " " + WHERE_KW "where" [] [WHITESPACE(" ")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF SELF_TYPE_KW "Self" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Copy" - WHITESPACE " " + IDENT "Copy" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/try_block_expr.rast b/crates/parser/test_data/parser/inline/ok/try_block_expr.rast index 472ce711c5fe..d216028d7a47 100644 --- a/crates/parser/test_data/parser/inline/ok/try_block_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/try_block_expr.rast @@ -1,48 +1,35 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BLOCK_EXPR TRY_BLOCK_MODIFIER - TRY_KW "try" - WHITESPACE " " + TRY_KW "try" [] [WHITESPACE(" ")] STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BLOCK_EXPR TRY_BLOCK_MODIFIER - TRY_KW "try" - WHITESPACE " " - BIKESHED_KW "bikeshed" - WHITESPACE " " + TRY_KW "try" [] [WHITESPACE(" ")] + BIKESHED_KW "bikeshed" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -56,12 +43,10 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "U" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/try_expr.rast b/crates/parser/test_data/parser/inline/ok/try_expr.rast index c3aa8c15ded0..82d0f5d532d5 100644 --- a/crates/parser/test_data/parser/inline/ok/try_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/try_expr.rast @@ -1,26 +1,22 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT TRY_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "x" + IDENT "x" [WHITESPACE(" ")] [] QUESTION "?" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/try_macro_fallback.rast b/crates/parser/test_data/parser/inline/ok/try_macro_fallback.rast index 38e21b845dc1..bf61e813322a 100644 --- a/crates/parser/test_data/parser/inline/ok/try_macro_fallback.rast +++ b/crates/parser/test_data/parser/inline/ok/try_macro_fallback.rast @@ -1,19 +1,14 @@ SOURCE_FILE FN - COMMENT "// 2015" - WHITESPACE "\n" - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [COMMENT("// 2015"), NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT MACRO_EXPR MACRO_CALL @@ -32,7 +27,6 @@ SOURCE_FILE R_PAREN ")" R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/try_macro_rules.rast b/crates/parser/test_data/parser/inline/ok/try_macro_rules.rast index e95fe7625847..9eca7fe42c3f 100644 --- a/crates/parser/test_data/parser/inline/ok/try_macro_rules.rast +++ b/crates/parser/test_data/parser/inline/ok/try_macro_rules.rast @@ -1,26 +1,18 @@ SOURCE_FILE MACRO_RULES - COMMENT "// 2015" - WHITESPACE "\n" - MACRO_RULES_KW "macro_rules" - BANG "!" - WHITESPACE " " + MACRO_RULES_KW "macro_rules" [COMMENT("// 2015"), NEWLINE("\n")] [] + BANG "!" [] [WHITESPACE(" ")] NAME - IDENT "try" - WHITESPACE " " + IDENT "try" [] [WHITESPACE(" ")] TOKEN_TREE - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] TOKEN_TREE L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] EQ "=" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] TOKEN_TREE L_CURLY "{" - R_CURLY "}" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/tuple_attrs.rast b/crates/parser/test_data/parser/inline/ok/tuple_attrs.rast index 76954927d566..613313e60101 100644 --- a/crates/parser/test_data/parser/inline/ok/tuple_attrs.rast +++ b/crates/parser/test_data/parser/inline/ok/tuple_attrs.rast @@ -1,11 +1,9 @@ SOURCE_FILE CONST - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] NAME IDENT "A" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" PATH_TYPE @@ -13,23 +11,19 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "i64" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i64" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" LITERAL INT_NUMBER "1" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LITERAL ATTR POUND "#" @@ -40,9 +34,8 @@ SOURCE_FILE CFG_ATOM IDENT "test" R_PAREN ")" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] INT_NUMBER "2" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/tuple_expr.rast b/crates/parser/test_data/parser/inline/ok/tuple_expr.rast index ac5a71703157..fa717122a5c4 100644 --- a/crates/parser/test_data/parser/inline/ok/tuple_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/tuple_expr.rast @@ -1,39 +1,33 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT TUPLE_EXPR - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT PAREN_EXPR - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] LITERAL INT_NUMBER "1" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT TUPLE_EXPR - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] LITERAL INT_NUMBER "1" COMMA "," R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/tuple_field_attrs.rast b/crates/parser/test_data/parser/inline/ok/tuple_field_attrs.rast index 1f7100c46d4e..a5e65eead236 100644 --- a/crates/parser/test_data/parser/inline/ok/tuple_field_attrs.rast +++ b/crates/parser/test_data/parser/inline/ok/tuple_field_attrs.rast @@ -1,10 +1,8 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] TUPLE_FIELD_LIST L_PAREN "(" TUPLE_FIELD @@ -16,13 +14,12 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "f32" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/tuple_mut_restrictions.rast b/crates/parser/test_data/parser/inline/ok/tuple_mut_restrictions.rast index 944133ff8551..1736979166d6 100644 --- a/crates/parser/test_data/parser/inline/ok/tuple_mut_restrictions.rast +++ b/crates/parser/test_data/parser/inline/ok/tuple_mut_restrictions.rast @@ -1,7 +1,6 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "Foo" TUPLE_FIELD_LIST @@ -15,8 +14,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF CRATE_KW "crate" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MUT_RESTRICTION MUT_KW "mut" VISIBILITY_INNER @@ -25,13 +23,12 @@ SOURCE_FILE PATH_SEGMENT NAME_REF SUPER_KW "super" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/tuple_pat.rast b/crates/parser/test_data/parser/inline/ok/tuple_pat.rast index c7cd11f774b6..fc1d5ee3daa2 100644 --- a/crates/parser/test_data/parser/inline/ok/tuple_pat.rast +++ b/crates/parser/test_data/parser/inline/ok/tuple_pat.rast @@ -1,120 +1,91 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_PAT L_PAREN "(" IDENT_PAT NAME IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "b" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT DOT2 ".." - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_PAT L_PAREN "(" IDENT_PAT NAME IDENT "a" COMMA "," - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_PAT L_PAREN "(" REST_PAT DOT2 ".." - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_PAT L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_PAT L_PAREN "(" OR_PAT - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "a" - WHITESPACE " " - PIPE "|" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + PIPE "|" [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] OR_PAT - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "b" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" TUPLE_EXPR @@ -125,7 +96,6 @@ SOURCE_FILE L_PAREN "(" R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/tuple_pat_fields.rast b/crates/parser/test_data/parser/inline/ok/tuple_pat_fields.rast index 96353f46976c..f13e5886b2f5 100644 --- a/crates/parser/test_data/parser/inline/ok/tuple_pat_fields.rast +++ b/crates/parser/test_data/parser/inline/ok/tuple_pat_fields.rast @@ -1,38 +1,30 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_STRUCT_PAT PATH PATH_SEGMENT NAME_REF IDENT "S" L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_STRUCT_PAT PATH PATH_SEGMENT @@ -41,18 +33,14 @@ SOURCE_FILE L_PAREN "(" WILDCARD_PAT UNDERSCORE "_" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_STRUCT_PAT PATH PATH_SEGMENT @@ -62,18 +50,14 @@ SOURCE_FILE WILDCARD_PAT UNDERSCORE "_" COMMA "," - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_STRUCT_PAT PATH PATH_SEGMENT @@ -82,28 +66,21 @@ SOURCE_FILE L_PAREN "(" WILDCARD_PAT UNDERSCORE "_" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REST_PAT - DOT2 ".." - WHITESPACE " " - COMMA "," - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "x" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_STRUCT_PAT PATH PATH_SEGMENT @@ -111,19 +88,15 @@ SOURCE_FILE IDENT "S" L_PAREN "(" OR_PAT - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "a" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/tuple_struct.rast b/crates/parser/test_data/parser/inline/ok/tuple_struct.rast index 6e5f6c2d2bb2..b088db04a6f1 100644 --- a/crates/parser/test_data/parser/inline/ok/tuple_struct.rast +++ b/crates/parser/test_data/parser/inline/ok/tuple_struct.rast @@ -1,7 +1,6 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" TUPLE_FIELD_LIST @@ -12,8 +11,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "String" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TUPLE_FIELD PATH_TYPE PATH @@ -21,5 +19,5 @@ SOURCE_FILE NAME_REF IDENT "usize" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/tuple_struct_where.rast b/crates/parser/test_data/parser/inline/ok/tuple_struct_where.rast index aab774165706..e9844742f9c9 100644 --- a/crates/parser/test_data/parser/inline/ok/tuple_struct_where.rast +++ b/crates/parser/test_data/parser/inline/ok/tuple_struct_where.rast @@ -1,7 +1,6 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" GENERIC_PARAM_LIST @@ -18,19 +17,16 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "T" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE " " + WHERE_KW "where" [] [WHITESPACE(" ")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -38,5 +34,5 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Clone" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/type_alias.rast b/crates/parser/test_data/parser/inline/ok/type_alias.rast index c5da799741f9..219e5ca88c0e 100644 --- a/crates/parser/test_data/parser/inline/ok/type_alias.rast +++ b/crates/parser/test_data/parser/inline/ok/type_alias.rast @@ -1,16 +1,13 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "Foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Bar" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/type_const.rast b/crates/parser/test_data/parser/inline/ok/type_const.rast index 9ceae9e44b3a..d376e7aa96d6 100644 --- a/crates/parser/test_data/parser/inline/ok/type_const.rast +++ b/crates/parser/test_data/parser/inline/ok/type_const.rast @@ -1,22 +1,17 @@ SOURCE_FILE CONST - TYPE_KW "type" - WHITESPACE " " - CONST_KW "const" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] + CONST_KW "const" [] [WHITESPACE(" ")] NAME IDENT "FOO" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "i32" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/type_item_type_params.rast b/crates/parser/test_data/parser/inline/ok/type_item_type_params.rast index 60ac3b3c4af0..a49742e55b3c 100644 --- a/crates/parser/test_data/parser/inline/ok/type_item_type_params.rast +++ b/crates/parser/test_data/parser/inline/ok/type_item_type_params.rast @@ -1,7 +1,6 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME IDENT "Result" GENERIC_PARAM_LIST @@ -9,12 +8,10 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - R_ANGLE ">" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/type_item_where_clause.rast b/crates/parser/test_data/parser/inline/ok/type_item_where_clause.rast index 31c87d1b3093..f9b4c7b829fc 100644 --- a/crates/parser/test_data/parser/inline/ok/type_item_where_clause.rast +++ b/crates/parser/test_data/parser/inline/ok/type_item_where_clause.rast @@ -1,27 +1,21 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "Foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE " " + WHERE_KW "where" [] [WHITESPACE(" ")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Foo" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -29,5 +23,5 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Copy" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/type_item_where_clause_deprecated.rast b/crates/parser/test_data/parser/inline/ok/type_item_where_clause_deprecated.rast index 7210b738958b..2001ae1908c5 100644 --- a/crates/parser/test_data/parser/inline/ok/type_item_where_clause_deprecated.rast +++ b/crates/parser/test_data/parser/inline/ok/type_item_where_clause_deprecated.rast @@ -1,33 +1,27 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE " " + WHERE_KW "where" [] [WHITESPACE(" ")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Foo" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Copy" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Copy" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/type_param.rast b/crates/parser/test_data/parser/inline/ok/type_param.rast index becb77e042f1..4b24c357f0d8 100644 --- a/crates/parser/test_data/parser/inline/ok/type_param.rast +++ b/crates/parser/test_data/parser/inline/ok/type_param.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" GENERIC_PARAM_LIST @@ -9,8 +8,7 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -21,10 +19,9 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/type_param_bounds.rast b/crates/parser/test_data/parser/inline/ok/type_param_bounds.rast index 259637c898ac..9e4c4cdada0f 100644 --- a/crates/parser/test_data/parser/inline/ok/type_param_bounds.rast +++ b/crates/parser/test_data/parser/inline/ok/type_param_bounds.rast @@ -1,7 +1,6 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" GENERIC_PARAM_LIST @@ -9,25 +8,20 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND QUESTION "?" PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Sized" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "Sized" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND L_PAREN "(" PATH_TYPE @@ -35,20 +29,17 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Copy" - R_PAREN ")" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND L_BRACK "[" CONST_KW "const" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Drop" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/type_param_default.rast b/crates/parser/test_data/parser/inline/ok/type_param_default.rast index cf7236f62e6b..76efbf508e6e 100644 --- a/crates/parser/test_data/parser/inline/ok/type_param_default.rast +++ b/crates/parser/test_data/parser/inline/ok/type_param_default.rast @@ -1,22 +1,19 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" GENERIC_PARAM_LIST L_ANGLE "<" TYPE_PARAM NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/type_path_in_pattern.rast b/crates/parser/test_data/parser/inline/ok/type_path_in_pattern.rast index 3d27afa5ecd7..b42fad2035ec 100644 --- a/crates/parser/test_data/parser/inline/ok/type_path_in_pattern.rast +++ b/crates/parser/test_data/parser/inline/ok/type_path_in_pattern.rast @@ -1,20 +1,16 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] PATH_PAT PATH PATH @@ -27,14 +23,11 @@ SOURCE_FILE COLON2 "::" PATH_SEGMENT NAME_REF - IDENT "Foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/typepathfn_with_coloncolon.rast b/crates/parser/test_data/parser/inline/ok/typepathfn_with_coloncolon.rast index fb442bfb7390..74b8e69dc9bf 100644 --- a/crates/parser/test_data/parser/inline/ok/typepathfn_with_coloncolon.rast +++ b/crates/parser/test_data/parser/inline/ok/typepathfn_with_coloncolon.rast @@ -1,12 +1,9 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "F" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "F" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH @@ -22,11 +19,9 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Middle" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PAREN_TYPE L_PAREN "(" PATH_TYPE @@ -39,16 +34,12 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "End" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "GenericArg" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "GenericArg" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -77,5 +68,5 @@ SOURCE_FILE NAME_REF IDENT "End" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/unary_expr.rast b/crates/parser/test_data/parser/inline/ok/unary_expr.rast index 525b26745873..d1f1a824eefc 100644 --- a/crates/parser/test_data/parser/inline/ok/unary_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/unary_expr.rast @@ -1,45 +1,39 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT PREFIX_EXPR - STAR "*" + STAR "*" [WHITESPACE(" ")] [] PREFIX_EXPR STAR "*" REF_EXPR AMP "&" LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT PREFIX_EXPR - BANG "!" + BANG "!" [WHITESPACE(" ")] [] PREFIX_EXPR BANG "!" LITERAL TRUE_KW "true" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT PREFIX_EXPR - MINUS "-" + MINUS "-" [WHITESPACE(" ")] [] PREFIX_EXPR MINUS "-" LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/union_item.rast b/crates/parser/test_data/parser/inline/ok/union_item.rast index af608fc4acba..4d5de6ec5ed2 100644 --- a/crates/parser/test_data/parser/inline/ok/union_item.rast +++ b/crates/parser/test_data/parser/inline/ok/union_item.rast @@ -1,35 +1,28 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME - IDENT "U" - WHITESPACE " " + IDENT "U" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_FIELD NAME IDENT "i" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] RECORD_FIELD NAME IDENT "f" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "f32" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + IDENT "f32" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/unit_struct.rast b/crates/parser/test_data/parser/inline/ok/unit_struct.rast index 438dea6f4087..a866f28f4a30 100644 --- a/crates/parser/test_data/parser/inline/ok/unit_struct.rast +++ b/crates/parser/test_data/parser/inline/ok/unit_struct.rast @@ -1,8 +1,7 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/unit_type.rast b/crates/parser/test_data/parser/inline/ok/unit_type.rast index b3df31535462..8d3fc270492f 100644 --- a/crates/parser/test_data/parser/inline/ok/unit_type.rast +++ b/crates/parser/test_data/parser/inline/ok/unit_type.rast @@ -1,14 +1,11 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/use_item.rast b/crates/parser/test_data/parser/inline/ok/use_item.rast index 25761ed8c77e..edc8a2350e35 100644 --- a/crates/parser/test_data/parser/inline/ok/use_item.rast +++ b/crates/parser/test_data/parser/inline/ok/use_item.rast @@ -1,7 +1,6 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -12,5 +11,5 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "collections" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/use_tree.rast b/crates/parser/test_data/parser/inline/ok/use_tree.rast index 98231cdc217f..4a15f9864fa8 100644 --- a/crates/parser/test_data/parser/inline/ok/use_tree.rast +++ b/crates/parser/test_data/parser/inline/ok/use_tree.rast @@ -1,7 +1,6 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -26,5 +25,5 @@ SOURCE_FILE NAME_REF IDENT "tree" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/use_tree_abs_star.rast b/crates/parser/test_data/parser/inline/ok/use_tree_abs_star.rast index b4dc1f25d9ad..3478aaa4c11f 100644 --- a/crates/parser/test_data/parser/inline/ok/use_tree_abs_star.rast +++ b/crates/parser/test_data/parser/inline/ok/use_tree_abs_star.rast @@ -1,15 +1,12 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE COLON2 "::" STAR "*" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT @@ -22,5 +19,5 @@ SOURCE_FILE COLON2 "::" STAR "*" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/use_tree_alias.rast b/crates/parser/test_data/parser/inline/ok/use_tree_alias.rast index ef0dd6ba11ce..fb7f5c86f677 100644 --- a/crates/parser/test_data/parser/inline/ok/use_tree_alias.rast +++ b/crates/parser/test_data/parser/inline/ok/use_tree_alias.rast @@ -1,32 +1,25 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT NAME_REF - IDENT "std" - WHITESPACE " " + IDENT "std" [] [WHITESPACE(" ")] RENAME - AS_KW "as" - WHITESPACE " " + AS_KW "as" [] [WHITESPACE(" ")] NAME IDENT "stdlib" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT NAME_REF - IDENT "Trait" - WHITESPACE " " + IDENT "Trait" [] [WHITESPACE(" ")] RENAME - AS_KW "as" - WHITESPACE " " + AS_KW "as" [] [WHITESPACE(" ")] UNDERSCORE "_" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/use_tree_list.rast b/crates/parser/test_data/parser/inline/ok/use_tree_list.rast index f3b1129f277a..b14415b05090 100644 --- a/crates/parser/test_data/parser/inline/ok/use_tree_list.rast +++ b/crates/parser/test_data/parser/inline/ok/use_tree_list.rast @@ -1,7 +1,6 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE USE_TREE_LIST L_CURLY "{" @@ -10,20 +9,18 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT NAME_REF IDENT "b" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT NAME_REF IDENT "c" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/use_tree_path.rast b/crates/parser/test_data/parser/inline/ok/use_tree_path.rast index ede22dbaf5d4..64eb18048ff6 100644 --- a/crates/parser/test_data/parser/inline/ok/use_tree_path.rast +++ b/crates/parser/test_data/parser/inline/ok/use_tree_path.rast @@ -1,18 +1,15 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "std" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -23,11 +20,9 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "collections" - SEMICOLON ";" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [NEWLINE("\n")] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -38,11 +33,9 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "m" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -53,11 +46,9 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "m" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -68,5 +59,5 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "m" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/use_tree_path_star.rast b/crates/parser/test_data/parser/inline/ok/use_tree_path_star.rast index d255adb5a47d..5d8ac2486a6c 100644 --- a/crates/parser/test_data/parser/inline/ok/use_tree_path_star.rast +++ b/crates/parser/test_data/parser/inline/ok/use_tree_path_star.rast @@ -1,7 +1,6 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT @@ -9,5 +8,5 @@ SOURCE_FILE IDENT "std" COLON2 "::" STAR "*" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/use_tree_path_use_tree.rast b/crates/parser/test_data/parser/inline/ok/use_tree_path_use_tree.rast index ed3cafae13b4..fc9014fe2e9d 100644 --- a/crates/parser/test_data/parser/inline/ok/use_tree_path_use_tree.rast +++ b/crates/parser/test_data/parser/inline/ok/use_tree_path_use_tree.rast @@ -1,7 +1,6 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT @@ -16,5 +15,5 @@ SOURCE_FILE NAME_REF IDENT "collections" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/use_tree_star.rast b/crates/parser/test_data/parser/inline/ok/use_tree_star.rast index 8662423f5d2c..3d026230c86f 100644 --- a/crates/parser/test_data/parser/inline/ok/use_tree_star.rast +++ b/crates/parser/test_data/parser/inline/ok/use_tree_star.rast @@ -1,14 +1,11 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE STAR "*" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT @@ -20,5 +17,5 @@ SOURCE_FILE USE_TREE STAR "*" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/variant_discriminant.rast b/crates/parser/test_data/parser/inline/ok/variant_discriminant.rast index 3494085e88fa..4291a148d873 100644 --- a/crates/parser/test_data/parser/inline/ok/variant_discriminant.rast +++ b/crates/parser/test_data/parser/inline/ok/variant_discriminant.rast @@ -1,13 +1,10 @@ SOURCE_FILE ENUM - ENUM_KW "enum" - WHITESPACE " " + ENUM_KW "enum" [] [WHITESPACE(" ")] NAME - IDENT "E" - WHITESPACE " " + IDENT "E" [] [WHITESPACE(" ")] VARIANT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] VARIANT NAME IDENT "X" @@ -19,13 +16,10 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "i32" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CONST_ARG LITERAL - INT_NUMBER "10" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + INT_NUMBER "10" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/where_clause.rast b/crates/parser/test_data/parser/inline/ok/where_clause.rast index 9adfe2caa732..75469eacd8a7 100644 --- a/crates/parser/test_data/parser/inline/ok/where_clause.rast +++ b/crates/parser/test_data/parser/inline/ok/where_clause.rast @@ -1,99 +1,82 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE "\n " + WHERE_KW "where" [] [NEWLINE("\n")] WHERE_PRED LIFETIME - LIFETIME_IDENT "'a" - COLON ":" - WHITESPACE " " + LIFETIME_IDENT "'a" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME - LIFETIME_IDENT "'b" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + LIFETIME_IDENT "'b" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND LIFETIME LIFETIME_IDENT "'c" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "T" - COLON ":" - WHITESPACE " " + IDENT "T" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Clone" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "Clone" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Copy" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "Copy" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND LIFETIME LIFETIME_IDENT "'static" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] WHERE_PRED PATH_TYPE PATH PATH PATH_SEGMENT NAME_REF - IDENT "Iterator" + IDENT "Iterator" [WHITESPACE(" ")] [] COLON2 "::" PATH_SEGMENT NAME_REF IDENT "Item" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME LIFETIME_IDENT "'a" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] WHERE_PRED PATH_TYPE PATH PATH PATH_SEGMENT TYPE_ANCHOR - L_ANGLE "<" + L_ANGLE "<" [WHITESPACE(" ")] [] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "T" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -104,15 +87,13 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Item" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE "\n" + LIFETIME_IDENT "'a" [] [NEWLINE("\n")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/where_pred_for.rast b/crates/parser/test_data/parser/inline/ok/where_pred_for.rast index b10b953f2fbc..989e713e6eac 100644 --- a/crates/parser/test_data/parser/inline/ok/where_pred_for.rast +++ b/crates/parser/test_data/parser/inline/ok/where_pred_for.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "for_trait" GENERIC_PARAM_LIST @@ -12,28 +11,24 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE "\n " + WHERE_KW "where" [] [NEWLINE("\n")] WHERE_PRED FOR_BINDER - FOR_KW "for" + FOR_KW "for" [WHITESPACE(" ")] [] GENERIC_PARAM_LIST L_ANGLE "<" LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "F" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -47,18 +42,15 @@ SOURCE_FILE REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "str" - R_PAREN ")" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/while_expr.rast b/crates/parser/test_data/parser/inline/ok/while_expr.rast index 16c522414af4..3c0d3bf024f1 100644 --- a/crates/parser/test_data/parser/inline/ok/while_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/while_expr.rast @@ -1,37 +1,29 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT WHILE_EXPR - WHILE_KW "while" - WHITESPACE " " + WHILE_KW "while" [WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT WHILE_EXPR - WHILE_KW "while" - WHITESPACE " " + WHILE_KW "while" [WHITESPACE(" ")] [WHITESPACE(" ")] LET_EXPR - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] TUPLE_STRUCT_PAT PATH PATH_SEGMENT @@ -41,10 +33,8 @@ SOURCE_FILE IDENT_PAT NAME IDENT "x" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] METHOD_CALL_EXPR PATH_EXPR PATH @@ -56,32 +46,25 @@ SOURCE_FILE IDENT "next" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT WHILE_EXPR - WHILE_KW "while" - WHITESPACE " " + WHILE_KW "while" [WHITESPACE(" ")] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/yeet_expr.rast b/crates/parser/test_data/parser/inline/ok/yeet_expr.rast index 24931bfcd7cd..9a0c1b0dbfed 100644 --- a/crates/parser/test_data/parser/inline/ok/yeet_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/yeet_expr.rast @@ -1,31 +1,23 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT YEET_EXPR - DO_KW "do" - WHITESPACE " " + DO_KW "do" [WHITESPACE(" ")] [WHITESPACE(" ")] YEET_KW "yeet" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] YEET_EXPR - DO_KW "do" - WHITESPACE " " - YEET_KW "yeet" - WHITESPACE " " + DO_KW "do" [WHITESPACE(" ")] [WHITESPACE(" ")] + YEET_KW "yeet" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "1" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + INT_NUMBER "1" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/inline/ok/yield_expr.rast b/crates/parser/test_data/parser/inline/ok/yield_expr.rast index 31aa58de299c..16f35d50f22a 100644 --- a/crates/parser/test_data/parser/inline/ok/yield_expr.rast +++ b/crates/parser/test_data/parser/inline/ok/yield_expr.rast @@ -1,29 +1,23 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT YIELD_EXPR - YIELD_KW "yield" - SEMICOLON ";" - WHITESPACE "\n " + YIELD_KW "yield" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT YIELD_EXPR - YIELD_KW "yield" - WHITESPACE " " + YIELD_KW "yield" [WHITESPACE(" ")] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0000_empty.rast b/crates/parser/test_data/parser/ok/0000_empty.rast index 40b9ef804c21..701f1392bd9a 100644 --- a/crates/parser/test_data/parser/ok/0000_empty.rast +++ b/crates/parser/test_data/parser/ok/0000_empty.rast @@ -1 +1,2 @@ SOURCE_FILE + EOF "" diff --git a/crates/parser/test_data/parser/ok/0001_struct_item.rast b/crates/parser/test_data/parser/ok/0001_struct_item.rast index 0e9639f23db6..3e4701201192 100644 --- a/crates/parser/test_data/parser/ok/0001_struct_item.rast +++ b/crates/parser/test_data/parser/ok/0001_struct_item.rast @@ -1,7 +1,6 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S" GENERIC_PARAM_LIST @@ -9,8 +8,7 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -18,22 +16,18 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Copy" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RECORD_FIELD NAME - IDENT "f" - COLON ":" - WHITESPACE " " + IDENT "f" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "T" - COMMA "," - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0002_struct_item_field.rast b/crates/parser/test_data/parser/ok/0002_struct_item_field.rast index dd52e5850e55..572161163bfa 100644 --- a/crates/parser/test_data/parser/ok/0002_struct_item_field.rast +++ b/crates/parser/test_data/parser/ok/0002_struct_item_field.rast @@ -1,22 +1,18 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RECORD_FIELD NAME - IDENT "foo" - COLON ":" - WHITESPACE " " + IDENT "foo" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u32" - WHITESPACE "\n" + IDENT "u32" [] [NEWLINE("\n")] R_CURLY "}" + EOF "" diff --git a/crates/parser/test_data/parser/ok/0004_file_shebang.rast b/crates/parser/test_data/parser/ok/0004_file_shebang.rast index 698957189fe2..935649e316b9 100644 --- a/crates/parser/test_data/parser/ok/0004_file_shebang.rast +++ b/crates/parser/test_data/parser/ok/0004_file_shebang.rast @@ -1,2 +1,3 @@ SOURCE_FILE SHEBANG "#!/use/bin/env rusti" + EOF "" diff --git a/crates/parser/test_data/parser/ok/0005_fn_item.rast b/crates/parser/test_data/parser/ok/0005_fn_item.rast index 756d20e4d6d8..be58401e4478 100644 --- a/crates/parser/test_data/parser/ok/0005_fn_item.rast +++ b/crates/parser/test_data/parser/ok/0005_fn_item.rast @@ -1,16 +1,13 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0006_inner_attributes.rast b/crates/parser/test_data/parser/ok/0006_inner_attributes.rast index ddab028c0686..21f3813560eb 100644 --- a/crates/parser/test_data/parser/ok/0006_inner_attributes.rast +++ b/crates/parser/test_data/parser/ok/0006_inner_attributes.rast @@ -8,8 +8,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -23,8 +22,7 @@ SOURCE_FILE L_PAREN "(" TRUE_KW "true" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -38,8 +36,7 @@ SOURCE_FILE L_PAREN "(" IDENT "ident" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -52,39 +49,28 @@ SOURCE_FILE TOKEN_TREE L_PAREN "(" IDENT "ident" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] INT_NUMBER "100" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TRUE_KW "true" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] STRING "\"true\"" - COMMA "," - WHITESPACE " " - IDENT "ident" - WHITESPACE " " - EQ "=" - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] + IDENT "ident" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] INT_NUMBER "100" - COMMA "," - WHITESPACE " " - IDENT "ident" - WHITESPACE " " - EQ "=" - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] + IDENT "ident" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] STRING "\"hello\"" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT "ident" TOKEN_TREE L_PAREN "(" INT_NUMBER "100" R_PAREN ")" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -98,8 +84,7 @@ SOURCE_FILE L_PAREN "(" INT_NUMBER "100" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -111,14 +96,11 @@ SOURCE_FILE IDENT "attr" TOKEN_TREE L_PAREN "(" - IDENT "enabled" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "enabled" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TRUE_KW "true" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -132,8 +114,7 @@ SOURCE_FILE L_PAREN "(" TRUE_KW "true" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -147,8 +128,7 @@ SOURCE_FILE L_PAREN "(" STRING "\"hello\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -161,16 +141,12 @@ SOURCE_FILE TOKEN_TREE L_PAREN "(" IDENT "C" - COMMA "," - WHITESPACE " " - IDENT "align" - WHITESPACE " " - EQ "=" - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] + IDENT "align" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] INT_NUMBER "4" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -183,8 +159,7 @@ SOURCE_FILE TOKEN_TREE L_PAREN "(" IDENT "C" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT "align" TOKEN_TREE L_PAREN "(" @@ -192,3 +167,4 @@ SOURCE_FILE R_PAREN ")" R_PAREN ")" R_BRACK "]" + EOF "" diff --git a/crates/parser/test_data/parser/ok/0007_extern_crate.rast b/crates/parser/test_data/parser/ok/0007_extern_crate.rast index 8b9259fd6b96..b09b5f971ca3 100644 --- a/crates/parser/test_data/parser/ok/0007_extern_crate.rast +++ b/crates/parser/test_data/parser/ok/0007_extern_crate.rast @@ -1,40 +1,28 @@ SOURCE_FILE EXTERN_CRATE - EXTERN_KW "extern" - WHITESPACE " " - CRATE_KW "crate" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + CRATE_KW "crate" [] [WHITESPACE(" ")] NAME_REF IDENT "foo" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] EXTERN_CRATE - EXTERN_KW "extern" - WHITESPACE " " - CRATE_KW "crate" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + CRATE_KW "crate" [] [WHITESPACE(" ")] NAME_REF - IDENT "foo" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] RENAME - AS_KW "as" - WHITESPACE " " + AS_KW "as" [] [WHITESPACE(" ")] NAME IDENT "bar" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] EXTERN_CRATE - EXTERN_KW "extern" - WHITESPACE " " - CRATE_KW "crate" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + CRATE_KW "crate" [] [WHITESPACE(" ")] NAME_REF - SELF_KW "self" - WHITESPACE " " + SELF_KW "self" [] [WHITESPACE(" ")] RENAME - AS_KW "as" - WHITESPACE " " + AS_KW "as" [] [WHITESPACE(" ")] NAME IDENT "baz" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0008_mod_item.rast b/crates/parser/test_data/parser/ok/0008_mod_item.rast index cb6da8717ddd..e6c6b5cadb0c 100644 --- a/crates/parser/test_data/parser/ok/0008_mod_item.rast +++ b/crates/parser/test_data/parser/ok/0008_mod_item.rast @@ -1,51 +1,37 @@ SOURCE_FILE MODULE - MOD_KW "mod" - WHITESPACE " " + MOD_KW "mod" [] [WHITESPACE(" ")] NAME - IDENT "c" - WHITESPACE " " + IDENT "c" [] [WHITESPACE(" ")] ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_FIELD_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] MODULE - MOD_KW "mod" - WHITESPACE " " + MOD_KW "mod" [NEWLINE("\n")] [WHITESPACE(" ")] NAME - IDENT "d" - WHITESPACE " " + IDENT "d" [] [WHITESPACE(" ")] ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] BANG "!" L_BRACK "[" PATH_META @@ -53,25 +39,18 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr" - R_BRACK "]" - WHITESPACE "\n " + R_BRACK "]" [] [NEWLINE("\n")] MODULE - MOD_KW "mod" - WHITESPACE " " + MOD_KW "mod" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "e" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] MODULE - MOD_KW "mod" - WHITESPACE " " + MOD_KW "mod" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME - IDENT "f" - WHITESPACE " " + IDENT "f" [] [WHITESPACE(" ")] ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0009_use_item.rast b/crates/parser/test_data/parser/ok/0009_use_item.rast index 04a44ef7e4b0..f3418a6ef1f9 100644 --- a/crates/parser/test_data/parser/ok/0009_use_item.rast +++ b/crates/parser/test_data/parser/ok/0009_use_item.rast @@ -1,17 +1,14 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT NAME_REF IDENT "foo" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT @@ -19,3 +16,4 @@ SOURCE_FILE NAME_REF IDENT "bar" SEMICOLON ";" + EOF "" diff --git a/crates/parser/test_data/parser/ok/0010_use_path_segments.rast b/crates/parser/test_data/parser/ok/0010_use_path_segments.rast index ddadec817b8d..c4792f6b607c 100644 --- a/crates/parser/test_data/parser/ok/0010_use_path_segments.rast +++ b/crates/parser/test_data/parser/ok/0010_use_path_segments.rast @@ -1,7 +1,6 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -18,11 +17,9 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "baz" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -38,5 +35,5 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "baz" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0011_outer_attribute.rast b/crates/parser/test_data/parser/ok/0011_outer_attribute.rast index 47a5cfce081a..441e9f5230a9 100644 --- a/crates/parser/test_data/parser/ok/0011_outer_attribute.rast +++ b/crates/parser/test_data/parser/ok/0011_outer_attribute.rast @@ -9,8 +9,7 @@ SOURCE_FILE CFG_ATOM IDENT "test" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" L_BRACK "[" @@ -19,40 +18,32 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Ignore" - R_BRACK "]" - WHITESPACE "\n" - FN_KW "fn" - WHITESPACE " " + R_BRACK "]" [] [NEWLINE("\n")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n\n" + R_CURLY "}" [] [NEWLINE("\n")] MODULE ATTR - POUND "#" + POUND "#" [NEWLINE("\n")] [] L_BRACK "[" KEY_VALUE_META PATH PATH_SEGMENT NAME_REF - IDENT "path" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "path" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL STRING "\"a.rs\"" - R_BRACK "]" - WHITESPACE "\n" - MOD_KW "mod" - WHITESPACE " " + R_BRACK "]" [] [NEWLINE("\n")] + MOD_KW "mod" [] [WHITESPACE(" ")] NAME IDENT "b" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0012_visibility.rast b/crates/parser/test_data/parser/ok/0012_visibility.rast index 348498daa990..6182b32d4eab 100644 --- a/crates/parser/test_data/parser/ok/0012_visibility.rast +++ b/crates/parser/test_data/parser/ok/0012_visibility.rast @@ -1,41 +1,32 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "a" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN VISIBILITY - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "b" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] MACRO_DEF VISIBILITY - PUB_KW "pub" - WHITESPACE " " - MACRO_KW "macro" - WHITESPACE " " + PUB_KW "pub" [] [WHITESPACE(" ")] + MACRO_KW "macro" [] [WHITESPACE(" ")] NAME IDENT "m" TOKEN_TREE @@ -43,12 +34,10 @@ SOURCE_FILE DOLLAR "$" COLON ":" IDENT "ident" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] TOKEN_TREE L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN VISIBILITY PUB_KW "pub" @@ -58,21 +47,17 @@ SOURCE_FILE PATH_SEGMENT NAME_REF CRATE_KW "crate" - R_PAREN ")" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "c" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN VISIBILITY PUB_KW "pub" @@ -82,28 +67,23 @@ SOURCE_FILE PATH_SEGMENT NAME_REF SUPER_KW "super" - R_PAREN ")" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "d" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN VISIBILITY PUB_KW "pub" VISIBILITY_INNER L_PAREN "(" - IN_KW "in" - WHITESPACE " " + IN_KW "in" [] [WHITESPACE(" ")] PATH PATH PATH @@ -118,18 +98,15 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "baz" - R_PAREN ")" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "e" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0013_use_path_self_super.rast b/crates/parser/test_data/parser/ok/0013_use_path_self_super.rast index 8a0149caca15..d6aebf3865d8 100644 --- a/crates/parser/test_data/parser/ok/0013_use_path_self_super.rast +++ b/crates/parser/test_data/parser/ok/0013_use_path_self_super.rast @@ -1,7 +1,6 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -12,11 +11,9 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "foo" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -32,5 +29,5 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "bar" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0014_use_tree.rast b/crates/parser/test_data/parser/ok/0014_use_tree.rast index b37edc365b43..f0bd06abda93 100644 --- a/crates/parser/test_data/parser/ok/0014_use_tree.rast +++ b/crates/parser/test_data/parser/ok/0014_use_tree.rast @@ -1,41 +1,32 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE STAR "*" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE COLON2 "::" STAR "*" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE COLON2 "::" USE_TREE_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE USE_TREE_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT @@ -43,11 +34,9 @@ SOURCE_FILE IDENT "foo" COLON2 "::" STAR "*" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT @@ -57,11 +46,9 @@ SOURCE_FILE USE_TREE_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT @@ -76,20 +63,18 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT NAME_REF IDENT "b" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT NAME_REF IDENT "c" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0015_use_tree.rast b/crates/parser/test_data/parser/ok/0015_use_tree.rast index ddf8aad6fcd6..4b98bb303b14 100644 --- a/crates/parser/test_data/parser/ok/0015_use_tree.rast +++ b/crates/parser/test_data/parser/ok/0015_use_tree.rast @@ -1,23 +1,18 @@ SOURCE_FILE USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT NAME_REF - IDENT "foo" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] RENAME - AS_KW "as" - WHITESPACE " " + AS_KW "as" [] [WHITESPACE(" ")] NAME IDENT "bar" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT @@ -30,36 +25,29 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] RENAME - AS_KW "as" - WHITESPACE " " + AS_KW "as" [] [WHITESPACE(" ")] NAME IDENT "b" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] USE_TREE STAR "*" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] USE_TREE COLON2 "::" STAR "*" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] USE_TREE PATH PATH_SEGMENT COLON2 "::" NAME_REF - IDENT "foo" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] RENAME - AS_KW "as" - WHITESPACE " " + AS_KW "as" [] [WHITESPACE(" ")] NAME IDENT "x" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0016_struct_flavors.rast b/crates/parser/test_data/parser/ok/0016_struct_flavors.rast index eb2724e2f366..ea8bb311598f 100644 --- a/crates/parser/test_data/parser/ok/0016_struct_flavors.rast +++ b/crates/parser/test_data/parser/ok/0016_struct_flavors.rast @@ -1,86 +1,67 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "A" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME - IDENT "B" - WHITESPACE " " + IDENT "B" [] [WHITESPACE(" ")] RECORD_FIELD_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "C" TUPLE_FIELD_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [NEWLINE("\n")] [WHITESPACE(" ")] NAME - IDENT "D" - WHITESPACE " " + IDENT "D" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RECORD_FIELD NAME - IDENT "a" - COLON ":" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u32" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] RECORD_FIELD VISIBILITY - PUB_KW "pub" - WHITESPACE " " + PUB_KW "pub" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "b" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u32" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + IDENT "u32" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "E" TUPLE_FIELD_LIST L_PAREN "(" TUPLE_FIELD VISIBILITY - PUB_KW "pub" - WHITESPACE " " + PUB_KW "pub" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "x" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TUPLE_FIELD PATH_TYPE PATH @@ -89,5 +70,5 @@ SOURCE_FILE IDENT "y" COMMA "," R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0017_attr_trailing_comma.rast b/crates/parser/test_data/parser/ok/0017_attr_trailing_comma.rast index c5d054702fa4..19c490bc38b9 100644 --- a/crates/parser/test_data/parser/ok/0017_attr_trailing_comma.rast +++ b/crates/parser/test_data/parser/ok/0017_attr_trailing_comma.rast @@ -13,18 +13,15 @@ SOURCE_FILE IDENT "a" COMMA "," R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" - FN_KW "fn" - WHITESPACE " " + R_BRACK "]" [] [NEWLINE("\n")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0018_struct_type_params.rast b/crates/parser/test_data/parser/ok/0018_struct_type_params.rast index 1e4eb1560954..039eb4e3fba2 100644 --- a/crates/parser/test_data/parser/ok/0018_struct_type_params.rast +++ b/crates/parser/test_data/parser/ok/0018_struct_type_params.rast @@ -1,7 +1,6 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S1" GENERIC_PARAM_LIST @@ -10,11 +9,9 @@ SOURCE_FILE NAME IDENT "T" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S2" GENERIC_PARAM_LIST @@ -32,11 +29,9 @@ SOURCE_FILE NAME_REF IDENT "u32" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S3" GENERIC_PARAM_LIST @@ -44,37 +39,29 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_FIELD NAME IDENT "u" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u32" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n\n" + IDENT "u32" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "S4" GENERIC_PARAM_LIST L_ANGLE "<" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S5" GENERIC_PARAM_LIST @@ -83,11 +70,9 @@ SOURCE_FILE LIFETIME LIFETIME_IDENT "'a" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S6" GENERIC_PARAM_LIST @@ -98,11 +83,9 @@ SOURCE_FILE COLON ":" TYPE_BOUND_LIST R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S7" GENERIC_PARAM_LIST @@ -110,18 +93,15 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME LIFETIME_IDENT "'b" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S8" GENERIC_PARAM_LIST @@ -129,21 +109,16 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME - LIFETIME_IDENT "'b" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + LIFETIME_IDENT "'b" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S9" GENERIC_PARAM_LIST @@ -151,24 +126,19 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME - LIFETIME_IDENT "'b" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + LIFETIME_IDENT "'b" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND LIFETIME LIFETIME_IDENT "'c" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S10" GENERIC_PARAM_LIST @@ -178,11 +148,9 @@ SOURCE_FILE LIFETIME_IDENT "'a" COMMA "," R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S11" GENERIC_PARAM_LIST @@ -190,17 +158,14 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'b" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S12" GENERIC_PARAM_LIST @@ -208,31 +173,26 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME LIFETIME_IDENT "'b" PLUS "+" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'b" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME LIFETIME_IDENT "'c" COMMA "," R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "S13" GENERIC_PARAM_LIST @@ -241,11 +201,9 @@ SOURCE_FILE NAME IDENT "T" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S14" GENERIC_PARAM_LIST @@ -253,17 +211,14 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_PARAM NAME IDENT "U" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "S15" GENERIC_PARAM_LIST @@ -271,16 +226,14 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_PARAM NAME IDENT "T" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_PARAM NAME IDENT "U" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0019_enums.rast b/crates/parser/test_data/parser/ok/0019_enums.rast index 24256ea29436..249fc81d191a 100644 --- a/crates/parser/test_data/parser/ok/0019_enums.rast +++ b/crates/parser/test_data/parser/ok/0019_enums.rast @@ -1,18 +1,13 @@ SOURCE_FILE ENUM - ENUM_KW "enum" - WHITESPACE " " + ENUM_KW "enum" [] [WHITESPACE(" ")] NAME - IDENT "E1" - WHITESPACE " " + IDENT "E1" [] [WHITESPACE(" ")] VARIANT_LIST - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] ENUM - ENUM_KW "enum" - WHITESPACE " " + ENUM_KW "enum" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "E2" GENERIC_PARAM_LIST @@ -20,118 +15,88 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] VARIANT_LIST - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] ENUM - ENUM_KW "enum" - WHITESPACE " " + ENUM_KW "enum" [NEWLINE("\n")] [WHITESPACE(" ")] NAME - IDENT "E3" - WHITESPACE " " + IDENT "E3" [] [WHITESPACE(" ")] VARIANT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] VARIANT NAME - IDENT "X" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + IDENT "X" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] ENUM - ENUM_KW "enum" - WHITESPACE " " + ENUM_KW "enum" [NEWLINE("\n")] [WHITESPACE(" ")] NAME - IDENT "E4" - WHITESPACE " " + IDENT "E4" [] [WHITESPACE(" ")] VARIANT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] VARIANT NAME - IDENT "X" - COMMA "," - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + IDENT "X" [WHITESPACE(" ")] [] + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] ENUM - ENUM_KW "enum" - WHITESPACE " " + ENUM_KW "enum" [NEWLINE("\n")] [WHITESPACE(" ")] NAME - IDENT "E5" - WHITESPACE " " + IDENT "E5" [] [WHITESPACE(" ")] VARIANT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] VARIANT NAME - IDENT "A" - COMMA "," - WHITESPACE "\n " + IDENT "A" [WHITESPACE(" ")] [] + COMMA "," [] [NEWLINE("\n")] VARIANT NAME - IDENT "B" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "B" [WHITESPACE(" ")] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CONST_ARG LITERAL INT_NUMBER "92" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] VARIANT NAME - IDENT "C" - WHITESPACE " " + IDENT "C" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RECORD_FIELD NAME - IDENT "a" - COLON ":" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u32" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] RECORD_FIELD VISIBILITY - PUB_KW "pub" - WHITESPACE " " + PUB_KW "pub" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "b" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "f64" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [] + COMMA "," [] [NEWLINE("\n")] VARIANT NAME - IDENT "F" - WHITESPACE " " + IDENT "F" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_FIELD_LIST L_CURLY "{" R_CURLY "}" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] VARIANT NAME - IDENT "D" + IDENT "D" [WHITESPACE(" ")] [] TUPLE_FIELD_LIST L_PAREN "(" TUPLE_FIELD @@ -142,25 +107,20 @@ SOURCE_FILE IDENT "u32" COMMA "," R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] VARIANT NAME - IDENT "E" + IDENT "E" [WHITESPACE(" ")] [] TUPLE_FIELD_LIST L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] VARIANT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CONST_ARG RANGE_EXPR DOT2 ".." - COMMA "," - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0020_type_param_bounds.rast b/crates/parser/test_data/parser/ok/0020_type_param_bounds.rast index 448cf49446e4..90fc888c8087 100644 --- a/crates/parser/test_data/parser/ok/0020_type_param_bounds.rast +++ b/crates/parser/test_data/parser/ok/0020_type_param_bounds.rast @@ -1,7 +1,6 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "A" GENERIC_PARAM_LIST @@ -10,11 +9,9 @@ SOURCE_FILE NAME IDENT "T" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "B" GENERIC_PARAM_LIST @@ -25,11 +22,9 @@ SOURCE_FILE COLON ":" TYPE_BOUND_LIST R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "C" GENERIC_PARAM_LIST @@ -37,18 +32,15 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME LIFETIME_IDENT "'a" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "D" GENERIC_PARAM_LIST @@ -56,21 +48,16 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "E" GENERIC_PARAM_LIST @@ -78,25 +65,19 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND LIFETIME - LIFETIME_IDENT "'d" - WHITESPACE " " + LIFETIME_IDENT "'d" [] [WHITESPACE(" ")] R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "F" GENERIC_PARAM_LIST @@ -104,21 +85,16 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND LIFETIME - LIFETIME_IDENT "'d" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + LIFETIME_IDENT "'d" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH @@ -126,11 +102,9 @@ SOURCE_FILE NAME_REF IDENT "Clone" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "G" GENERIC_PARAM_LIST @@ -138,18 +112,15 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Clone" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "Clone" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH @@ -157,11 +128,9 @@ SOURCE_FILE NAME_REF IDENT "Copy" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "H" GENERIC_PARAM_LIST @@ -169,8 +138,7 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -178,10 +146,8 @@ SOURCE_FILE PATH_SEGMENT COLON2 "::" NAME_REF - IDENT "Foo" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH @@ -192,19 +158,15 @@ SOURCE_FILE COLON2 "::" PATH_SEGMENT NAME_REF - IDENT "Bar" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "Bar" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND LIFETIME LIFETIME_IDENT "'a" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "I" GENERIC_PARAM_LIST @@ -214,8 +176,7 @@ SOURCE_FILE IDENT "T" COLON ":" TYPE_BOUND_LIST - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_PARAM NAME IDENT "U" @@ -223,11 +184,9 @@ SOURCE_FILE TYPE_BOUND_LIST COMMA "," R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME IDENT "K" GENERIC_PARAM_LIST @@ -235,49 +194,38 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME LIFETIME_IDENT "'d" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'d" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND LIFETIME LIFETIME_IDENT "'b" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TYPE_PARAM NAME IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND LIFETIME - LIFETIME_IDENT "'d" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + LIFETIME_IDENT "'d" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH @@ -286,3 +234,4 @@ SOURCE_FILE IDENT "Clone" R_ANGLE ">" SEMICOLON ";" + EOF "" diff --git a/crates/parser/test_data/parser/ok/0022_empty_extern_block.rast b/crates/parser/test_data/parser/ok/0022_empty_extern_block.rast index ef2fb66dd524..8ed08933f47e 100644 --- a/crates/parser/test_data/parser/ok/0022_empty_extern_block.rast +++ b/crates/parser/test_data/parser/ok/0022_empty_extern_block.rast @@ -1,21 +1,15 @@ SOURCE_FILE EXTERN_BLOCK ABI - EXTERN_KW "extern" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] EXTERN_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] EXTERN_BLOCK ABI - EXTERN_KW "extern" - WHITESPACE " " - STRING "\"C\"" - WHITESPACE " " + EXTERN_KW "extern" [NEWLINE("\n")] [WHITESPACE(" ")] + STRING "\"C\"" [] [WHITESPACE(" ")] EXTERN_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0023_static_items.rast b/crates/parser/test_data/parser/ok/0023_static_items.rast index b164e828e301..1bb01d0dd61f 100644 --- a/crates/parser/test_data/parser/ok/0023_static_items.rast +++ b/crates/parser/test_data/parser/ok/0023_static_items.rast @@ -1,41 +1,31 @@ SOURCE_FILE STATIC - STATIC_KW "static" - WHITESPACE " " + STATIC_KW "static" [] [WHITESPACE(" ")] NAME IDENT "FOO" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u32" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "u32" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] STATIC - STATIC_KW "static" - WHITESPACE " " - MUT_KW "mut" - WHITESPACE " " + STATIC_KW "static" [] [WHITESPACE(" ")] + MUT_KW "mut" [] [WHITESPACE(" ")] NAME IDENT "BAR" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "i32" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "92" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0024_const_item.rast b/crates/parser/test_data/parser/ok/0024_const_item.rast index 40b9ef804c21..701f1392bd9a 100644 --- a/crates/parser/test_data/parser/ok/0024_const_item.rast +++ b/crates/parser/test_data/parser/ok/0024_const_item.rast @@ -1 +1,2 @@ SOURCE_FILE + EOF "" diff --git a/crates/parser/test_data/parser/ok/0025_extern_fn_in_block.rast b/crates/parser/test_data/parser/ok/0025_extern_fn_in_block.rast index 9c5f5ac64e98..9d67030ae39a 100644 --- a/crates/parser/test_data/parser/ok/0025_extern_fn_in_block.rast +++ b/crates/parser/test_data/parser/ok/0025_extern_fn_in_block.rast @@ -1,33 +1,26 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN ABI - EXTERN_KW "extern" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + EXTERN_KW "extern" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0026_const_fn_in_block.rast b/crates/parser/test_data/parser/ok/0026_const_fn_in_block.rast index ca9a3df86f6e..4fc7c0790911 100644 --- a/crates/parser/test_data/parser/ok/0026_const_fn_in_block.rast +++ b/crates/parser/test_data/parser/ok/0026_const_fn_in_block.rast @@ -1,32 +1,25 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - CONST_KW "const" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + CONST_KW "const" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0027_unsafe_fn_in_block.rast b/crates/parser/test_data/parser/ok/0027_unsafe_fn_in_block.rast index 88ebd1095201..fbcfffb78ece 100644 --- a/crates/parser/test_data/parser/ok/0027_unsafe_fn_in_block.rast +++ b/crates/parser/test_data/parser/ok/0027_unsafe_fn_in_block.rast @@ -1,43 +1,32 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - UNSAFE_KW "unsafe" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + UNSAFE_KW "unsafe" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] BLOCK_EXPR - UNSAFE_KW "unsafe" - WHITESPACE " " + UNSAFE_KW "unsafe" [WHITESPACE(" ")] [WHITESPACE(" ")] STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "92" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + INT_NUMBER "92" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0028_operator_binding_power.rast b/crates/parser/test_data/parser/ok/0028_operator_binding_power.rast index 43802572888f..69f7e510d723 100644 --- a/crates/parser/test_data/parser/ok/0028_operator_binding_power.rast +++ b/crates/parser/test_data/parser/ok/0028_operator_binding_power.rast @@ -1,403 +1,296 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "binding_power" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "x" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] BIN_EXPR BIN_EXPR LITERAL - INT_NUMBER "2" - WHITESPACE " " - STAR "*" - WHITESPACE " " + INT_NUMBER "2" [] [WHITESPACE(" ")] + STAR "*" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "3" - WHITESPACE " " - PERCENT "%" - WHITESPACE " " + INT_NUMBER "3" [] [WHITESPACE(" ")] + PERCENT "%" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "4" - WHITESPACE " " - MINUS "-" - WHITESPACE " " + INT_NUMBER "4" [] [WHITESPACE(" ")] + MINUS "-" [] [WHITESPACE(" ")] BIN_EXPR LITERAL - INT_NUMBER "5" - WHITESPACE " " - SLASH "/" - WHITESPACE " " + INT_NUMBER "5" [] [WHITESPACE(" ")] + SLASH "/" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "6" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + INT_NUMBER "1" [WHITESPACE(" ")] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] BIN_EXPR LITERAL - INT_NUMBER "2" - WHITESPACE " " - STAR "*" - WHITESPACE " " + INT_NUMBER "2" [] [WHITESPACE(" ")] + STAR "*" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "3" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - SHL "<<" - WHITESPACE " " + INT_NUMBER "1" [WHITESPACE(" ")] [WHITESPACE(" ")] + SHL "<<" [] [WHITESPACE(" ")] BIN_EXPR LITERAL - INT_NUMBER "2" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + INT_NUMBER "2" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "3" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - AMP "&" - WHITESPACE " " + INT_NUMBER "1" [WHITESPACE(" ")] [WHITESPACE(" ")] + AMP "&" [] [WHITESPACE(" ")] BIN_EXPR LITERAL - INT_NUMBER "2" - WHITESPACE " " - SHR ">>" - WHITESPACE " " + INT_NUMBER "2" [] [WHITESPACE(" ")] + SHR ">>" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "3" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - CARET "^" - WHITESPACE " " + INT_NUMBER "1" [WHITESPACE(" ")] [WHITESPACE(" ")] + CARET "^" [] [WHITESPACE(" ")] BIN_EXPR LITERAL - INT_NUMBER "2" - WHITESPACE " " - AMP "&" - WHITESPACE " " + INT_NUMBER "2" [] [WHITESPACE(" ")] + AMP "&" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "3" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - PIPE "|" - WHITESPACE " " + INT_NUMBER "1" [WHITESPACE(" ")] [WHITESPACE(" ")] + PIPE "|" [] [WHITESPACE(" ")] BIN_EXPR LITERAL - INT_NUMBER "2" - WHITESPACE " " - CARET "^" - WHITESPACE " " + INT_NUMBER "2" [] [WHITESPACE(" ")] + CARET "^" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "3" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - EQ2 "==" - WHITESPACE " " + INT_NUMBER "1" [WHITESPACE(" ")] [WHITESPACE(" ")] + EQ2 "==" [] [WHITESPACE(" ")] BIN_EXPR LITERAL - INT_NUMBER "2" - WHITESPACE " " - PIPE "|" - WHITESPACE " " + INT_NUMBER "2" [] [WHITESPACE(" ")] + PIPE "|" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "3" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - AMP2 "&&" - WHITESPACE " " + INT_NUMBER "1" [WHITESPACE(" ")] [WHITESPACE(" ")] + AMP2 "&&" [] [WHITESPACE(" ")] BIN_EXPR LITERAL - INT_NUMBER "2" - WHITESPACE " " - EQ2 "==" - WHITESPACE " " + INT_NUMBER "2" [] [WHITESPACE(" ")] + EQ2 "==" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "3" - SEMICOLON ";" - WHITESPACE "\n " - COMMENT "//1 || 2 && 2;" - WHITESPACE "\n " - COMMENT "//1 .. 2 || 3;" - WHITESPACE "\n " - COMMENT "//1 = 2 .. 3;" - WHITESPACE "\n " - COMMENT "//---&*1 - --2 * 9;" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" "), COMMENT("//1 || 2 && 2;"), NEWLINE("\n"), WHITESPACE(" "), COMMENT("//1 .. 2 || 3;"), NEWLINE("\n"), WHITESPACE(" "), COMMENT("//1 = 2 .. 3;"), NEWLINE("\n"), WHITESPACE(" "), COMMENT("//---&*1 - --2 * 9;"), NEWLINE("\n")] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "right_associative" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "b" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "b" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "c" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "b" - WHITESPACE " " - PLUSEQ "+=" - WHITESPACE " " + IDENT "b" [] [WHITESPACE(" ")] + PLUSEQ "+=" [] [WHITESPACE(" ")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "c" - WHITESPACE " " - MINUSEQ "-=" - WHITESPACE " " + IDENT "c" [] [WHITESPACE(" ")] + MINUSEQ "-=" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "d" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "b" - WHITESPACE " " - STAREQ "*=" - WHITESPACE " " + IDENT "b" [] [WHITESPACE(" ")] + STAREQ "*=" [] [WHITESPACE(" ")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "c" - WHITESPACE " " - SLASHEQ "/=" - WHITESPACE " " + IDENT "c" [] [WHITESPACE(" ")] + SLASHEQ "/=" [] [WHITESPACE(" ")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "d" - WHITESPACE " " - PERCENTEQ "%=" - WHITESPACE " " + IDENT "d" [] [WHITESPACE(" ")] + PERCENTEQ "%=" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "e" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "b" - WHITESPACE " " - AMPEQ "&=" - WHITESPACE " " + IDENT "b" [] [WHITESPACE(" ")] + AMPEQ "&=" [] [WHITESPACE(" ")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "c" - WHITESPACE " " - PIPEEQ "|=" - WHITESPACE " " + IDENT "c" [] [WHITESPACE(" ")] + PIPEEQ "|=" [] [WHITESPACE(" ")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "d" - WHITESPACE " " - CARETEQ "^=" - WHITESPACE " " + IDENT "d" [] [WHITESPACE(" ")] + CARETEQ "^=" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "e" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "b" - WHITESPACE " " - SHLEQ "<<=" - WHITESPACE " " + IDENT "b" [] [WHITESPACE(" ")] + SHLEQ "<<=" [] [WHITESPACE(" ")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "c" - WHITESPACE " " - SHREQ ">>=" - WHITESPACE " " + IDENT "c" [] [WHITESPACE(" ")] + SHREQ ">>=" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "d" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "mixed_associativity" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " - COMMENT "// (a + b) = (c += ((d * e) = f))" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR BIN_EXPR @@ -405,51 +298,40 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "a" [WHITESPACE(" "), COMMENT("// (a + b) = (c += ((d * e) = f))"), NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "b" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "b" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "c" - WHITESPACE " " - PLUSEQ "+=" - WHITESPACE " " + IDENT "c" [] [WHITESPACE(" ")] + PLUSEQ "+=" [] [WHITESPACE(" ")] BIN_EXPR BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "d" - WHITESPACE " " - STAR "*" - WHITESPACE " " + IDENT "d" [] [WHITESPACE(" ")] + STAR "*" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "e" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "e" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "f" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0029_range_forms.rast b/crates/parser/test_data/parser/ok/0029_range_forms.rast index 5acc54e713ea..97e2ce39dcdc 100644 --- a/crates/parser/test_data/parser/ok/0029_range_forms.rast +++ b/crates/parser/test_data/parser/ok/0029_range_forms.rast @@ -1,152 +1,119 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RANGE_EXPR - DOT2 ".." + DOT2 ".." [WHITESPACE(" ")] [] BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR RANGE_EXPR - DOT2 ".." + DOT2 ".." [WHITESPACE(" ")] [] PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "z" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "z" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "x" [WHITESPACE(" ")] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] RANGE_EXPR LITERAL FALSE_KW "false" DOT2 ".." BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - EQ2 "==" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + EQ2 "==" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "x" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] RANGE_EXPR LITERAL INT_NUMBER "1" DOT2 ".." - SEMICOLON ";" - WHITESPACE "\n \n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT RANGE_EXPR - DOT2EQ "..=" + DOT2EQ "..=" [WHITESPACE(" "), NEWLINE("\n"), WHITESPACE(" ")] [] BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR RANGE_EXPR - DOT2EQ "..=" + DOT2EQ "..=" [WHITESPACE(" ")] [] PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "z" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "z" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "x" [WHITESPACE(" ")] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] RANGE_EXPR LITERAL FALSE_KW "false" DOT2EQ "..=" BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - EQ2 "==" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + EQ2 "==" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "x" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] RANGE_EXPR LITERAL INT_NUMBER "1" DOT2 ".." - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0030_string_suffixes.rast b/crates/parser/test_data/parser/ok/0030_string_suffixes.rast index 44211c7c4200..64a9e9ada7fa 100644 --- a/crates/parser/test_data/parser/ok/0030_string_suffixes.rast +++ b/crates/parser/test_data/parser/ok/0030_string_suffixes.rast @@ -1,64 +1,45 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL CHAR "'c'u32" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL STRING "\"string\"invalid" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL BYTE "b'b'_suff" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL BYTE_STRING "b\"bs\"invalid" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0030_traits.rast b/crates/parser/test_data/parser/ok/0030_traits.rast index 3965ae9596b5..d959ab228aa6 100644 --- a/crates/parser/test_data/parser/ok/0030_traits.rast +++ b/crates/parser/test_data/parser/ok/0030_traits.rast @@ -1,37 +1,27 @@ SOURCE_FILE TRAIT - TRAIT_KW "trait" - WHITESPACE " " + TRAIT_KW "trait" [] [WHITESPACE(" ")] NAME - IDENT "Runnable" - WHITESPACE " " + IDENT "Runnable" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "handler" PARAM_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] TRAIT - TRAIT_KW "trait" - WHITESPACE " " + TRAIT_KW "trait" [NEWLINE("\n")] [WHITESPACE(" ")] NAME - IDENT "TraitWithExpr" - WHITESPACE " " + IDENT "TraitWithExpr" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "fn_with_expr" PARAM_LIST @@ -40,8 +30,7 @@ SOURCE_FILE IDENT_PAT NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] ARRAY_TYPE L_BRACK "[" PATH_TYPE @@ -49,14 +38,12 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "i32" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] CONST_ARG LITERAL INT_NUMBER "1" R_BRACK "]" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0031_extern.rast b/crates/parser/test_data/parser/ok/0031_extern.rast index 70b527808628..aba788727cfc 100644 --- a/crates/parser/test_data/parser/ok/0031_extern.rast +++ b/crates/parser/test_data/parser/ok/0031_extern.rast @@ -1,17 +1,13 @@ SOURCE_FILE EXTERN_BLOCK ABI - EXTERN_KW "extern" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] EXTERN_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN VISIBILITY - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "socket" PARAM_LIST @@ -20,61 +16,51 @@ SOURCE_FILE IDENT_PAT NAME IDENT "domain" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "ty" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "protocol" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN VISIBILITY - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "bind" PARAM_LIST @@ -83,63 +69,52 @@ SOURCE_FILE IDENT_PAT NAME IDENT "fd" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "addr" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "sockaddr" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "len" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "socklen_t" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN VISIBILITY - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "connect" PARAM_LIST @@ -148,63 +123,52 @@ SOURCE_FILE IDENT_PAT NAME IDENT "socket" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "address" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "sockaddr" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] PARAM IDENT_PAT NAME - IDENT "len" - COLON ":" - WHITESPACE " " + IDENT "len" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "socklen_t" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN VISIBILITY - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "listen" PARAM_LIST @@ -213,47 +177,39 @@ SOURCE_FILE IDENT_PAT NAME IDENT "socket" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "backlog" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN VISIBILITY - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "getsockname" PARAM_LIST @@ -262,67 +218,55 @@ SOURCE_FILE IDENT_PAT NAME IDENT "socket" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "address" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "sockaddr" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] PARAM IDENT_PAT NAME - IDENT "address_len" - COLON ":" - WHITESPACE " " + IDENT "address_len" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "socklen_t" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN VISIBILITY - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "getsockopt" PARAM_LIST @@ -331,97 +275,81 @@ SOURCE_FILE IDENT_PAT NAME IDENT "sockfd" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] PARAM IDENT_PAT NAME - IDENT "level" - COLON ":" - WHITESPACE " " + IDENT "level" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] PARAM IDENT_PAT NAME - IDENT "optname" - COLON ":" - WHITESPACE " " + IDENT "optname" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] PARAM IDENT_PAT NAME - IDENT "optval" - COLON ":" - WHITESPACE " " + IDENT "optval" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_void" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] PARAM IDENT_PAT NAME - IDENT "optlen" - COLON ":" - WHITESPACE " " + IDENT "optlen" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "socklen_t" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN VISIBILITY - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "setsockopt" PARAM_LIST @@ -430,92 +358,77 @@ SOURCE_FILE IDENT_PAT NAME IDENT "socket" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "level" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "name" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] PARAM IDENT_PAT NAME - IDENT "value" - COLON ":" - WHITESPACE " " + IDENT "value" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_void" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] PARAM IDENT_PAT NAME - IDENT "option_len" - COLON ":" - WHITESPACE " " + IDENT "option_len" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "socklen_t" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN VISIBILITY - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "getpeername" PARAM_LIST @@ -524,67 +437,55 @@ SOURCE_FILE IDENT_PAT NAME IDENT "socket" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "address" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "sockaddr" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] PARAM IDENT_PAT NAME - IDENT "address_len" - COLON ":" - WHITESPACE " " + IDENT "address_len" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "socklen_t" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN VISIBILITY - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "sendto" PARAM_LIST @@ -593,109 +494,91 @@ SOURCE_FILE IDENT_PAT NAME IDENT "socket" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "buf" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_void" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "len" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "size_t" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] PARAM IDENT_PAT NAME - IDENT "flags" - COLON ":" - WHITESPACE " " + IDENT "flags" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "addr" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "sockaddr" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] PARAM IDENT_PAT NAME - IDENT "addrlen" - COLON ":" - WHITESPACE " " + IDENT "addrlen" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "socklen_t" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "ssize_t" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN VISIBILITY - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "send" PARAM_LIST @@ -704,79 +587,66 @@ SOURCE_FILE IDENT_PAT NAME IDENT "socket" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "buf" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_void" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "len" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "size_t" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] PARAM IDENT_PAT NAME - IDENT "flags" - COLON ":" - WHITESPACE " " + IDENT "flags" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "ssize_t" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN VISIBILITY - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "recvfrom" PARAM_LIST @@ -785,115 +655,96 @@ SOURCE_FILE IDENT_PAT NAME IDENT "socket" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "buf" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_void" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "len" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "size_t" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] PARAM IDENT_PAT NAME - IDENT "flags" - COLON ":" - WHITESPACE " " + IDENT "flags" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "addr" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "sockaddr" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] PARAM IDENT_PAT NAME - IDENT "addrlen" - COLON ":" - WHITESPACE " " + IDENT "addrlen" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "socklen_t" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "ssize_t" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN VISIBILITY - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "recv" PARAM_LIST @@ -902,72 +753,61 @@ SOURCE_FILE IDENT_PAT NAME IDENT "socket" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "buf" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_void" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "len" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "size_t" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] PARAM IDENT_PAT NAME - IDENT "flags" - COLON ":" - WHITESPACE " " + IDENT "flags" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "c_int" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT COLON2 "::" NAME_REF IDENT "ssize_t" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0032_where_for.rast b/crates/parser/test_data/parser/ok/0032_where_for.rast index dcaf58f7f98e..602c318b1d50 100644 --- a/crates/parser/test_data/parser/ok/0032_where_for.rast +++ b/crates/parser/test_data/parser/ok/0032_where_for.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "test_serialization" GENERIC_PARAM_LIST @@ -12,29 +11,24 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE "\n " + WHERE_KW "where" [] [NEWLINE("\n")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "SER" - COLON ":" - WHITESPACE " " + IDENT "SER" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Serialize" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "Serialize" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND FOR_BINDER FOR_KW "for" @@ -43,8 +37,7 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'de" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -55,19 +48,15 @@ SOURCE_FILE LIFETIME_ARG LIFETIME LIFETIME_IDENT "'de" - R_ANGLE ">" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "PartialEq" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "PartialEq" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH @@ -84,10 +73,9 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Debug" - COMMA "," - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0033_label_break.rast b/crates/parser/test_data/parser/ok/0033_label_break.rast index df1acd6b83b9..9b72bee8b2ee 100644 --- a/crates/parser/test_data/parser/ok/0033_label_break.rast +++ b/crates/parser/test_data/parser/ok/0033_label_break.rast @@ -1,56 +1,45 @@ SOURCE_FILE FN - COMMENT "// format with label break value." - WHITESPACE "\n" - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [COMMENT("// format with label break value."), NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR LABEL LIFETIME - LIFETIME_IDENT "'empty_block" - COLON ":" - WHITESPACE " " + LIFETIME_IDENT "'empty_block" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n\n " + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR LABEL LIFETIME - LIFETIME_IDENT "'block" - COLON ":" - WHITESPACE " " + LIFETIME_IDENT "'block" [NEWLINE("\n"), WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "do_thing" + IDENT "do_thing" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -59,38 +48,31 @@ SOURCE_FILE IDENT "condition_not_met" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BREAK_EXPR - BREAK_KW "break" - WHITESPACE " " + BREAK_KW "break" [WHITESPACE(" ")] [WHITESPACE(" ")] LIFETIME LIFETIME_IDENT "'block" - SEMICOLON ";" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "do_next_thing" + IDENT "do_next_thing" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -99,58 +81,45 @@ SOURCE_FILE IDENT "condition_not_met" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BREAK_EXPR - BREAK_KW "break" - WHITESPACE " " + BREAK_KW "break" [WHITESPACE(" ")] [WHITESPACE(" ")] LIFETIME LIFETIME_IDENT "'block" - SEMICOLON ";" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "do_last_thing" + IDENT "do_last_thing" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "result" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "result" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BLOCK_EXPR LABEL LIFETIME LIFETIME_IDENT "'block" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -159,31 +128,22 @@ SOURCE_FILE IDENT "foo" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " - COMMENT "// comment" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BREAK_EXPR - BREAK_KW "break" - WHITESPACE " " + BREAK_KW "break" [WHITESPACE(" "), COMMENT("// comment"), NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] LIFETIME - LIFETIME_IDENT "'block" - WHITESPACE " " + LIFETIME_IDENT "'block" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] EXPR_STMT IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -192,32 +152,22 @@ SOURCE_FILE IDENT "bar" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " - COMMENT "/* comment */" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BREAK_EXPR - BREAK_KW "break" - WHITESPACE " " + BREAK_KW "break" [WHITESPACE(" "), COMMENT("/* comment */"), NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] LIFETIME - LIFETIME_IDENT "'block" - WHITESPACE " " + LIFETIME_IDENT "'block" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" - SEMICOLON ";" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] LITERAL - INT_NUMBER "3" - WHITESPACE "\n " - R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + INT_NUMBER "3" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0034_crate_path_in_call.rast b/crates/parser/test_data/parser/ok/0034_crate_path_in_call.rast index 2b3b86ebf2d0..86ab6d02ac64 100644 --- a/crates/parser/test_data/parser/ok/0034_crate_path_in_call.rast +++ b/crates/parser/test_data/parser/ok/0034_crate_path_in_call.rast @@ -1,24 +1,21 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "make_query" + IDENT "make_query" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" PATH_EXPR @@ -37,7 +34,6 @@ SOURCE_FILE NAME_REF IDENT "module_tree" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0035_weird_exprs.rast b/crates/parser/test_data/parser/ok/0035_weird_exprs.rast index b96711c613ca..1d545365d17d 100644 --- a/crates/parser/test_data/parser/ok/0035_weird_exprs.rast +++ b/crates/parser/test_data/parser/ok/0035_weird_exprs.rast @@ -1,18 +1,14 @@ SOURCE_FILE DOC_COMMENT - INNER_DOC_COMMENT "//! Adapted from a `rustc` test, which can be found at " - WHITESPACE "\n" + INNER_DOC_COMMENT "//! Adapted from a `rustc` test, which can be found at " [] [NEWLINE("\n")] DOC_COMMENT - INNER_DOC_COMMENT "//! https://github.com/rust-lang/rust/blob/6d34ec18c7d7e574553f6347ecf08e1e1c45c13d/src/test/run-pass/weird-exprs.rs." - WHITESPACE "\n" + INNER_DOC_COMMENT "//! https://github.com/rust-lang/rust/blob/6d34ec18c7d7e574553f6347ecf08e1e1c45c13d/src/test/run-pass/weird-exprs.rs." [] [NEWLINE("\n")] DOC_COMMENT - INNER_DOC_COMMENT "//! " - WHITESPACE "\n" + INNER_DOC_COMMENT "//! " [] [NEWLINE("\n")] DOC_COMMENT - INNER_DOC_COMMENT "//! Reported to rust-analyzer in https://github.com/rust-lang/rust-analyzer/issues/290" - WHITESPACE "\n\n" + INNER_DOC_COMMENT "//! Reported to rust-analyzer in https://github.com/rust-lang/rust-analyzer/issues/290" [] [NEWLINE("\n")] ATTR - POUND "#" + POUND "#" [NEWLINE("\n")] [] BANG "!" L_BRACK "[" TOKEN_TREE_META @@ -24,8 +20,7 @@ SOURCE_FILE L_PAREN "(" IDENT "non_camel_case_types" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -39,8 +34,7 @@ SOURCE_FILE L_PAREN "(" IDENT "dead_code" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -54,8 +48,7 @@ SOURCE_FILE L_PAREN "(" IDENT "unreachable_code" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR POUND "#" BANG "!" @@ -69,27 +62,22 @@ SOURCE_FILE L_PAREN "(" IDENT "unused_parens" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n\n" + R_BRACK "]" [] [NEWLINE("\n")] ATTR - POUND "#" + POUND "#" [NEWLINE("\n")] [] BANG "!" L_BRACK "[" KEY_VALUE_META PATH PATH_SEGMENT NAME_REF - IDENT "recursion_limit" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "recursion_limit" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL STRING "\"128\"" - R_BRACK "]" - WHITESPACE "\n\n" + R_BRACK "]" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [NEWLINE("\n")] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -105,11 +93,9 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Cell" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] USE - USE_KW "use" - WHITESPACE " " + USE_KW "use" [] [WHITESPACE(" ")] USE_TREE PATH PATH @@ -125,73 +111,54 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "swap" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "// Just a grab bag of stuff that you wouldn't want to actually write." - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n"), COMMENT("// Just a grab bag of stuff that you wouldn't want to actually write."), NEWLINE("\n"), NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "strange" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "bool" - WHITESPACE " " + IDENT "bool" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "_x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "bool" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "bool" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] RETURN_EXPR - RETURN_KW "return" - WHITESPACE " " + RETURN_KW "return" [] [WHITESPACE(" ")] LITERAL TRUE_KW "true" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "funny" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST @@ -200,51 +167,41 @@ SOURCE_FILE IDENT_PAT NAME IDENT "_x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n " + L_CURLY "{" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "f" + IDENT "f" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" RETURN_EXPR RETURN_KW "return" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "what" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "the" PARAM_LIST @@ -253,8 +210,7 @@ SOURCE_FILE IDENT_PAT NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] REF_TYPE AMP "&" PATH_TYPE @@ -271,19 +227,15 @@ SOURCE_FILE NAME_REF IDENT "bool" R_ANGLE ">" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RETURN_EXPR - RETURN_KW "return" - WHITESPACE " " + RETURN_KW "return" [WHITESPACE(" ")] [WHITESPACE(" ")] WHILE_EXPR - WHILE_KW "while" - WHITESPACE " " + WHILE_KW "while" [] [WHITESPACE(" ")] PREFIX_EXPR BANG "!" METHOD_CALL_EXPR @@ -297,12 +249,10 @@ SOURCE_FILE IDENT "get" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT METHOD_CALL_EXPR PATH_EXPR @@ -318,22 +268,16 @@ SOURCE_FILE LITERAL TRUE_KW "true" R_PAREN ")" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "i" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "i" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_EXPR AMP "&" CALL_EXPR @@ -352,17 +296,13 @@ SOURCE_FILE LITERAL FALSE_KW "false" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "dont" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "dont" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" @@ -385,27 +325,25 @@ SOURCE_FILE IDENT "i" R_PAREN ")" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "dont" + IDENT "dont" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT MACRO_EXPR MACRO_CALL PATH PATH_SEGMENT NAME_REF - IDENT "assert" + IDENT "assert" [WHITESPACE(" ")] [] BANG "!" TOKEN_TREE L_PAREN "(" @@ -419,221 +357,160 @@ SOURCE_FILE R_PAREN ")" R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "zombiejesus" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LOOP_EXPR - LOOP_KW "loop" - WHITESPACE " " + LOOP_KW "loop" [WHITESPACE(" ")] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT WHILE_EXPR - WHILE_KW "while" - WHITESPACE " " + WHILE_KW "while" [WHITESPACE(" ")] [WHITESPACE(" ")] PAREN_EXPR L_PAREN "(" RETURN_EXPR RETURN_KW "return" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] PAREN_EXPR L_PAREN "(" RETURN_EXPR RETURN_KW "return" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] PAREN_EXPR L_PAREN "(" RETURN_EXPR RETURN_KW "return" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM LITERAL_PAT LITERAL - INT_NUMBER "1" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + INT_NUMBER "1" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] PAREN_EXPR L_PAREN "(" RETURN_EXPR RETURN_KW "return" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RETURN_EXPR - RETURN_KW "return" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE " " - ELSE_KW "else" - WHITESPACE " " + RETURN_KW "return" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [WHITESPACE(" ")] + ELSE_KW "else" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RETURN_EXPR - RETURN_KW "return" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n " + RETURN_KW "return" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RETURN_EXPR - RETURN_KW "return" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n " - R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE " " - ELSE_KW "else" - WHITESPACE " " + RETURN_KW "return" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [WHITESPACE(" ")] + ELSE_KW "else" [] [WHITESPACE(" ")] IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [] [WHITESPACE(" ")] PAREN_EXPR L_PAREN "(" RETURN_EXPR RETURN_KW "return" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RETURN_EXPR - RETURN_KW "return" - SEMICOLON ";" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n " + RETURN_KW "return" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] PAREN_EXPR L_PAREN "(" RETURN_EXPR RETURN_KW "return" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT BREAK_EXPR BREAK_KW "break" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "notsure" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] NAME IDENT "_x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "isize" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] NAME - IDENT "_y" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "_y" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR PAREN_EXPR L_PAREN "(" @@ -642,16 +519,12 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "_x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "_x" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - R_PAREN ")" - WHITESPACE " " - EQ2 "==" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ2 "==" [] [WHITESPACE(" ")] PAREN_EXPR L_PAREN "(" BIN_EXPR @@ -659,26 +532,19 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "_x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "_x" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] NAME - IDENT "_z" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "_z" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR PAREN_EXPR L_PAREN "(" @@ -687,16 +553,12 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "_x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "_x" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - R_PAREN ")" - WHITESPACE " " - L_ANGLE "<" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + L_ANGLE "<" [] [WHITESPACE(" ")] PAREN_EXPR L_PAREN "(" BIN_EXPR @@ -704,24 +566,18 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "_x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "_x" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "_a" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "_a" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR PAREN_EXPR L_PAREN "(" @@ -730,16 +586,12 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "_x" - WHITESPACE " " - PLUSEQ "+=" - WHITESPACE " " + IDENT "_x" [] [WHITESPACE(" ")] + PLUSEQ "+=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - R_PAREN ")" - WHITESPACE " " - EQ2 "==" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ2 "==" [] [WHITESPACE(" ")] PAREN_EXPR L_PAREN "(" BIN_EXPR @@ -747,24 +599,18 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "_x" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "_x" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "_b" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "_b" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR CALL_EXPR PATH_EXPR @@ -776,28 +622,23 @@ SOURCE_FILE L_PAREN "(" REF_EXPR AMP "&" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "_y" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REF_EXPR AMP "&" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "_z" - R_PAREN ")" - WHITESPACE " " - EQ2 "==" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ2 "==" [] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -808,87 +649,67 @@ SOURCE_FILE L_PAREN "(" REF_EXPR AMP "&" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "_y" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] REF_EXPR AMP "&" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "_z" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "canttouchthis" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "usize" - WHITESPACE " " + IDENT "usize" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "p" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "bool" - WHITESPACE " " + IDENT "bool" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n " + TRUE_KW "true" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "_a" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "_a" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PAREN_EXPR L_PAREN "(" BIN_EXPR @@ -905,10 +726,8 @@ SOURCE_FILE L_PAREN "(" TRUE_KW "true" R_PAREN ")" - R_PAREN ")" - WHITESPACE " " - EQ2 "==" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ2 "==" [] [WHITESPACE(" ")] PAREN_EXPR L_PAREN "(" MACRO_EXPR @@ -927,17 +746,13 @@ SOURCE_FILE R_PAREN ")" R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "_c" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "_c" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PAREN_EXPR L_PAREN "(" BIN_EXPR @@ -957,32 +772,25 @@ SOURCE_FILE L_PAREN "(" R_PAREN ")" R_PAREN ")" - R_PAREN ")" - WHITESPACE " " - EQ2 "==" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ2 "==" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "_b" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "bool" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "bool" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PAREN_EXPR L_PAREN "(" BIN_EXPR @@ -996,149 +804,109 @@ SOURCE_FILE TOKEN_TREE L_PAREN "(" STRING "\"{}\"" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] INT_NUMBER "0" - R_PAREN ")" - WHITESPACE " " - EQ2 "==" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ2 "==" [] [WHITESPACE(" ")] PAREN_EXPR L_PAREN "(" RETURN_EXPR - RETURN_KW "return" - WHITESPACE " " + RETURN_KW "return" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "angrydome" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT LOOP_EXPR - LOOP_KW "loop" - WHITESPACE " " + LOOP_KW "loop" [WHITESPACE(" ")] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [] [WHITESPACE(" ")] BREAK_EXPR - BREAK_KW "break" - WHITESPACE " " + BREAK_KW "break" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n " + L_CURLY "{" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] NAME - IDENT "i" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "i" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LOOP_EXPR - LOOP_KW "loop" - WHITESPACE " " + LOOP_KW "loop" [WHITESPACE(" ")] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "i" - WHITESPACE " " - PLUSEQ "+=" - WHITESPACE " " + IDENT "i" [] [WHITESPACE(" ")] + PLUSEQ "+=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] EXPR_STMT IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [] [WHITESPACE(" ")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "i" - WHITESPACE " " - EQ2 "==" - WHITESPACE " " + IDENT "i" [] [WHITESPACE(" ")] + EQ2 "==" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "1" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [] [WHITESPACE(" ")] PAREN_EXPR L_PAREN "(" CONTINUE_EXPR CONTINUE_KW "continue" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] MATCH_ARM LITERAL_PAT LITERAL - INT_NUMBER "1" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] R_CURLY "}" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] MACRO_EXPR MACRO_CALL PATH @@ -1149,43 +917,31 @@ SOURCE_FILE TOKEN_TREE L_PAREN "(" STRING "\"wat\"" - R_PAREN ")" - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n " + R_PAREN ")" [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT BREAK_EXPR - BREAK_KW "break" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + BREAK_KW "break" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "evil_lincoln" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "_evil" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "_evil" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] MACRO_EXPR MACRO_CALL PATH @@ -1197,30 +953,25 @@ SOURCE_FILE L_PAREN "(" STRING "\"lincoln\"" R_PAREN ")" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "dots" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT MACRO_EXPR MACRO_CALL PATH PATH_SEGMENT NAME_REF - IDENT "assert_eq" + IDENT "assert_eq" [WHITESPACE(" ")] [] BANG "!" TOKEN_TREE L_PAREN "(" @@ -1232,98 +983,69 @@ SOURCE_FILE L_PAREN "(" STRING "\"..................................................\"" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - IDENT "format" + COMMA "," [] [NEWLINE("\n")] + IDENT "format" [WHITESPACE(" ")] [] BANG "!" TOKEN_TREE L_PAREN "(" STRING "\"{:?}\"" - COMMA "," - WHITESPACE " " - DOT "." - DOT "." - WHITESPACE " " - DOT "." - DOT "." - WHITESPACE " " - DOT "." - DOT "." - WHITESPACE " " - DOT "." - DOT "." - WHITESPACE " " - DOT "." + COMMA "," [] [WHITESPACE(" ")] DOT "." - WHITESPACE " " + DOT "." [] [WHITESPACE(" ")] DOT "." + DOT "." [] [WHITESPACE(" ")] DOT "." - WHITESPACE " " + DOT "." [] [WHITESPACE(" ")] DOT "." + DOT "." [] [WHITESPACE(" ")] DOT "." - WHITESPACE " " + DOT "." [] [WHITESPACE(" ")] DOT "." + DOT "." [] [WHITESPACE(" ")] DOT "." - WHITESPACE " " + DOT "." [] [WHITESPACE(" ")] DOT "." + DOT "." [] [WHITESPACE(" ")] DOT "." - WHITESPACE " " + DOT "." [] [WHITESPACE(" ")] DOT "." + DOT "." [] [WHITESPACE(" ")] DOT "." - WHITESPACE " " + DOT "." [] [WHITESPACE(" ")] DOT "." + DOT "." [] [WHITESPACE(" ")] DOT "." - WHITESPACE " " + DOT "." [] [NEWLINE("\n")] + DOT "." [WHITESPACE(" ")] [] + DOT "." [] [WHITESPACE(" ")] DOT "." + DOT "." [] [WHITESPACE(" ")] DOT "." - WHITESPACE " " + DOT "." [] [WHITESPACE(" ")] DOT "." + DOT "." [] [WHITESPACE(" ")] DOT "." - WHITESPACE "\n " + DOT "." [] [WHITESPACE(" ")] DOT "." + DOT "." [] [WHITESPACE(" ")] DOT "." - WHITESPACE " " + DOT "." [] [WHITESPACE(" ")] DOT "." + DOT "." [] [WHITESPACE(" ")] DOT "." - WHITESPACE " " + DOT "." [] [WHITESPACE(" ")] DOT "." + DOT "." [] [WHITESPACE(" ")] DOT "." - WHITESPACE " " - DOT "." - DOT "." - WHITESPACE " " - DOT "." - DOT "." - WHITESPACE " " - DOT "." - DOT "." - WHITESPACE " " - DOT "." - DOT "." - WHITESPACE " " - DOT "." - DOT "." - WHITESPACE " " - DOT "." - DOT "." - WHITESPACE " " - DOT "." - DOT "." - WHITESPACE " " - DOT "." - DOT "." - WHITESPACE " " + DOT "." [] [WHITESPACE(" ")] DOT "." DOT "." R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "u8" PARAM_LIST @@ -1332,150 +1054,108 @@ SOURCE_FILE IDENT_PAT NAME IDENT "u8" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u8" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "u8" - WHITESPACE " " - NEQ "!=" - WHITESPACE " " + IDENT "u8" [] [WHITESPACE(" ")] + NEQ "!=" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "0u8" - WHITESPACE " " + INT_NUMBER "0u8" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT MACRO_EXPR MACRO_CALL PATH PATH_SEGMENT NAME_REF - IDENT "assert_eq" + IDENT "assert_eq" [WHITESPACE(" ")] [] BANG "!" TOKEN_TREE L_PAREN "(" INT_NUMBER "8u8" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TOKEN_TREE - L_CURLY "{" - WHITESPACE "\n " - IDENT "macro_rules" - BANG "!" - WHITESPACE " " - IDENT "u8" - WHITESPACE " " + L_CURLY "{" [] [NEWLINE("\n")] + IDENT "macro_rules" [WHITESPACE(" ")] [] + BANG "!" [] [WHITESPACE(" ")] + IDENT "u8" [] [WHITESPACE(" ")] TOKEN_TREE - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] TOKEN_TREE - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] IDENT "u8" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] EQ "=" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] TOKEN_TREE - L_CURLY "{" - WHITESPACE "\n " - MOD_KW "mod" - WHITESPACE " " - IDENT "u8" - WHITESPACE " " + L_CURLY "{" [] [NEWLINE("\n")] + MOD_KW "mod" [WHITESPACE(" ")] [WHITESPACE(" ")] + IDENT "u8" [] [WHITESPACE(" ")] TOKEN_TREE - L_CURLY "{" - WHITESPACE "\n " - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + L_CURLY "{" [] [NEWLINE("\n")] + PUB_KW "pub" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] IDENT "u8" L_ANGLE "<" LIFETIME_IDENT "'u8" - COLON ":" - WHITESPACE " " - LIFETIME_IDENT "'u8" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] + LIFETIME_IDENT "'u8" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] LIFETIME_IDENT "'u8" R_ANGLE ">" TOKEN_TREE L_PAREN "(" IDENT "u8" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] AMP "&" - LIFETIME_IDENT "'u8" - WHITESPACE " " + LIFETIME_IDENT "'u8" [] [WHITESPACE(" ")] IDENT "u8" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MINUS "-" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] AMP "&" - LIFETIME_IDENT "'u8" - WHITESPACE " " - IDENT "u8" - WHITESPACE " " + LIFETIME_IDENT "'u8" [] [WHITESPACE(" ")] + IDENT "u8" [] [WHITESPACE(" ")] TOKEN_TREE - L_CURLY "{" - WHITESPACE "\n " - STRING "\"u8\"" - SEMICOLON ";" - WHITESPACE "\n " - IDENT "u8" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n " - R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " - IDENT "u8" + L_CURLY "{" [] [NEWLINE("\n")] + STRING "\"u8\"" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] + IDENT "u8" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + IDENT "u8" [NEWLINE("\n"), WHITESPACE(" ")] [] BANG "!" TOKEN_TREE L_PAREN "(" IDENT "u8" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " - LET_KW "let" - WHITESPACE " " + SEMICOLON ";" [] [NEWLINE("\n")] + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] AMP "&" IDENT "u8" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] AMP "&" - IDENT "u8" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "u8" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] IDENT "u8" COLON ":" COLON ":" @@ -1485,9 +1165,8 @@ SOURCE_FILE AMP "&" INT_NUMBER "8u8" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " - CRATE_KW "crate" + SEMICOLON ";" [] [NEWLINE("\n")] + CRATE_KW "crate" [WHITESPACE(" ")] [] COLON ":" COLON ":" IDENT "u8" @@ -1495,38 +1174,30 @@ SOURCE_FILE L_PAREN "(" INT_NUMBER "0u8" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " - IDENT "u8" - WHITESPACE "\n " - R_CURLY "}" + SEMICOLON ";" [] [NEWLINE("\n")] + IDENT "u8" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [] R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "fishy" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT MACRO_EXPR MACRO_CALL PATH PATH_SEGMENT NAME_REF - IDENT "assert_eq" + IDENT "assert_eq" [WHITESPACE(" ")] [] BANG "!" TOKEN_TREE L_PAREN "(" @@ -1538,9 +1209,8 @@ SOURCE_FILE L_PAREN "(" STRING "\"><>\"" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - IDENT "String" + COMMA "," [] [NEWLINE("\n")] + IDENT "String" [WHITESPACE(" ")] [] COLON ":" COLON ":" L_ANGLE "<" @@ -1585,26 +1255,20 @@ SOURCE_FILE L_PAREN "(" R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "union" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] UNION - UNION_KW "union" - WHITESPACE " " + UNION_KW "union" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "union" GENERIC_PARAM_LIST @@ -1612,21 +1276,17 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'union" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_FIELD NAME IDENT "union" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'union" - WHITESPACE " " + LIFETIME_IDENT "'union" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -1638,34 +1298,25 @@ SOURCE_FILE LIFETIME LIFETIME_IDENT "'union" R_ANGLE ">" - COMMA "," - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + COMMA "," [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "special_characters" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "val" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "val" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PREFIX_EXPR BANG "!" PAREN_EXPR @@ -1720,8 +1371,7 @@ SOURCE_FILE COMMA "," LITERAL CHAR "'🤔'" - R_PAREN ")" - COMMENT "/**/" + R_PAREN ")" [] [COMMENT("/**/")] COMMA "," BLOCK_EXPR STMT_LIST @@ -1749,43 +1399,34 @@ SOURCE_FILE R_BRACK "]" SEMICOLON ";" R_CURLY "}" - R_PAREN ")" - COMMENT "//" - WHITESPACE "\n " - SEMICOLON ";" - WHITESPACE "\n " + R_PAREN ")" [] [COMMENT("//"), NEWLINE("\n")] + SEMICOLON ";" [WHITESPACE(" ")] [NEWLINE("\n")] EXPR_STMT MACRO_EXPR MACRO_CALL PATH PATH_SEGMENT NAME_REF - IDENT "assert" + IDENT "assert" [WHITESPACE(" ")] [] BANG "!" TOKEN_TREE L_PAREN "(" BANG "!" IDENT "val" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "punch_card" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] IMPL_TRAIT_TYPE - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -1802,91 +1443,66 @@ SOURCE_FILE COLON2 "::" PATH_SEGMENT NAME_REF - IDENT "Debug" - WHITESPACE " " + IDENT "Debug" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RANGE_EXPR - DOT2EQ "..=" + DOT2EQ "..=" [WHITESPACE(" ")] [] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE "\n " + DOT2 ".." [] [NEWLINE("\n")] RANGE_EXPR - DOT2EQ "..=" + DOT2EQ "..=" [WHITESPACE(" ")] [] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR @@ -1894,232 +1510,179 @@ SOURCE_FILE RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE "\n " + DOT2 ".." [] [NEWLINE("\n")] RANGE_EXPR - DOT2EQ "..=" + DOT2EQ "..=" [WHITESPACE(" ")] [] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE "\n " + DOT2 ".." [] [NEWLINE("\n")] RANGE_EXPR - DOT2EQ "..=" + DOT2EQ "..=" [WHITESPACE(" ")] [] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE "\n " + DOT2 ".." [] [NEWLINE("\n")] RANGE_EXPR - DOT2EQ "..=" + DOT2EQ "..=" [WHITESPACE(" ")] [] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE "\n " + DOT2 ".." [] [NEWLINE("\n")] RANGE_EXPR - DOT2EQ "..=" + DOT2EQ "..=" [WHITESPACE(" ")] [] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE "\n " + DOT2 ".." [] [NEWLINE("\n")] RANGE_EXPR - DOT2EQ "..=" + DOT2EQ "..=" [WHITESPACE(" ")] [] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR DOT2EQ "..=" RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + DOT2 ".." [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "ktulhu" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " - SEMICOLON ";" + L_CURLY "{" [] [NEWLINE("\n")] + SEMICOLON ";" [WHITESPACE(" ")] [] SEMICOLON ";" SEMICOLON ";" EXPR_STMT @@ -2137,207 +1700,186 @@ SOURCE_FILE SEMICOLON ";" TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + R_PAREN ")" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN VISIBILITY - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [NEWLINE("\n")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "strange" + IDENT "strange" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "funny" + IDENT "funny" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "what" + IDENT "what" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "zombiejesus" + IDENT "zombiejesus" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "notsure" + IDENT "notsure" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "canttouchthis" + IDENT "canttouchthis" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "angrydome" + IDENT "angrydome" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "evil_lincoln" + IDENT "evil_lincoln" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "dots" + IDENT "dots" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "u8" + IDENT "u8" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" LITERAL INT_NUMBER "8u8" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "fishy" + IDENT "fishy" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "union" + IDENT "union" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "special_characters" + IDENT "special_characters" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "punch_card" + IDENT "punch_card" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "ktulhu" + IDENT "ktulhu" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0036_fully_qualified.rast b/crates/parser/test_data/parser/ok/0036_fully_qualified.rast index 2fecb1cc47d8..9de2726437f5 100644 --- a/crates/parser/test_data/parser/ok/0036_fully_qualified.rast +++ b/crates/parser/test_data/parser/ok/0036_fully_qualified.rast @@ -1,12 +1,8 @@ SOURCE_FILE - COMMENT "// https://github.com/rust-lang/rust-analyzer/issues/311" - WHITESPACE "\n\n" FN VISIBILITY - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [COMMENT("// https://github.com/rust-lang/rust-analyzer/issues/311"), NEWLINE("\n"), NEWLINE("\n")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" GENERIC_PARAM_LIST @@ -14,8 +10,7 @@ SOURCE_FILE TYPE_PARAM NAME IDENT "S" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -26,35 +21,29 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "String" - WHITESPACE "\n" + IDENT "String" [] [NEWLINE("\n")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE "\n " + WHERE_KW "where" [] [NEWLINE("\n")] WHERE_PRED PATH_TYPE PATH PATH PATH_SEGMENT TYPE_ANCHOR - L_ANGLE "<" + L_ANGLE "<" [WHITESPACE(" ")] [] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -65,8 +54,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Item" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -74,21 +62,18 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Eq" - COMMA "," - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] METHOD_CALL_EXPR LITERAL - STRING "\"\"" + STRING "\"\"" [WHITESPACE(" ")] [] DOT "." NAME_REF IDENT "to_owned" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0037_mod.rast b/crates/parser/test_data/parser/ok/0037_mod.rast index 59c33eba25c1..0460c867845a 100644 --- a/crates/parser/test_data/parser/ok/0037_mod.rast +++ b/crates/parser/test_data/parser/ok/0037_mod.rast @@ -1,17 +1,11 @@ SOURCE_FILE - COMMENT "// https://github.com/rust-lang/rust-analyzer/issues/357" - WHITESPACE "\n\n" DOC_COMMENT - INNER_DOC_COMMENT "//! docs" - WHITESPACE "\n" + INNER_DOC_COMMENT "//! docs" [COMMENT("// https://github.com/rust-lang/rust-analyzer/issues/357"), NEWLINE("\n"), NEWLINE("\n")] [NEWLINE("\n")] MODULE - COMMENT "// non-docs" - WHITESPACE "\n" - MOD_KW "mod" - WHITESPACE " " + MOD_KW "mod" [COMMENT("// non-docs"), NEWLINE("\n")] [WHITESPACE(" ")] NAME - IDENT "foo" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] ITEM_LIST L_CURLY "{" R_CURLY "}" + EOF "" diff --git a/crates/parser/test_data/parser/ok/0038_where_pred_type.rast b/crates/parser/test_data/parser/ok/0038_where_pred_type.rast index e89763042026..9414e46a2d0c 100644 --- a/crates/parser/test_data/parser/ok/0038_where_pred_type.rast +++ b/crates/parser/test_data/parser/ok/0038_where_pred_type.rast @@ -1,16 +1,13 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "test" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE " " + WHERE_KW "where" [] [WHITESPACE(" ")] WHERE_PRED TUPLE_TYPE L_PAREN "(" @@ -19,25 +16,23 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "u64" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u64" R_PAREN ")" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" + EOF "" diff --git a/crates/parser/test_data/parser/ok/0039_raw_fn_item.rast b/crates/parser/test_data/parser/ok/0039_raw_fn_item.rast index 2eeed781c1a9..0486b6efe6c7 100644 --- a/crates/parser/test_data/parser/ok/0039_raw_fn_item.rast +++ b/crates/parser/test_data/parser/ok/0039_raw_fn_item.rast @@ -1,16 +1,13 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "r#foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0040_raw_struct_item_field.rast b/crates/parser/test_data/parser/ok/0040_raw_struct_item_field.rast index ceb918420f56..3ba3e6ea46fd 100644 --- a/crates/parser/test_data/parser/ok/0040_raw_struct_item_field.rast +++ b/crates/parser/test_data/parser/ok/0040_raw_struct_item_field.rast @@ -1,22 +1,18 @@ SOURCE_FILE STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [] [WHITESPACE(" ")] NAME - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] RECORD_FIELD NAME - IDENT "r#foo" - COLON ":" - WHITESPACE " " + IDENT "r#foo" [WHITESPACE(" ")] [] + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u32" - WHITESPACE "\n" + IDENT "u32" [] [NEWLINE("\n")] R_CURLY "}" + EOF "" diff --git a/crates/parser/test_data/parser/ok/0041_raw_keywords.rast b/crates/parser/test_data/parser/ok/0041_raw_keywords.rast index dacf0ce74260..2a240bd40c06 100644 --- a/crates/parser/test_data/parser/ok/0041_raw_keywords.rast +++ b/crates/parser/test_data/parser/ok/0041_raw_keywords.rast @@ -1,50 +1,38 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "r#struct" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "r#struct" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "92" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "r#trait" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "r#trait" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "r#struct" - WHITESPACE " " - STAR "*" - WHITESPACE " " + IDENT "r#struct" [] [WHITESPACE(" ")] + STAR "*" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] R_CURLY "}" + EOF "" diff --git a/crates/parser/test_data/parser/ok/0042_ufcs_call_list.rast b/crates/parser/test_data/parser/ok/0042_ufcs_call_list.rast index d1d1ffacf0d3..6df112a897ed 100644 --- a/crates/parser/test_data/parser/ok/0042_ufcs_call_list.rast +++ b/crates/parser/test_data/parser/ok/0042_ufcs_call_list.rast @@ -1,65 +1,49 @@ SOURCE_FILE - COMMENT "// https://github.com/rust-lang/rust-analyzer/issues/596" - WHITESPACE "\n\n" STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [COMMENT("// https://github.com/rust-lang/rust-analyzer/issues/596"), NEWLINE("\n"), NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "Foo" - SEMICOLON ";" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [NEWLINE("\n")] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "bar" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "bool" - WHITESPACE " " + IDENT "bool" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MACRO_EXPR MACRO_CALL PATH PATH_SEGMENT NAME_REF - IDENT "unimplemented" + IDENT "unimplemented" [WHITESPACE(" ")] [] BANG "!" TOKEN_TREE L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + R_PAREN ")" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "baz" PARAM_LIST @@ -67,39 +51,33 @@ SOURCE_FILE PARAM WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "bool" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "baz" + IDENT "baz" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" CALL_EXPR @@ -122,7 +100,6 @@ SOURCE_FILE ARG_LIST L_PAREN "(" R_PAREN ")" - R_PAREN ")" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0043_complex_assignment.rast b/crates/parser/test_data/parser/ok/0043_complex_assignment.rast index f3c85b45b6bd..4ee7f7a72b96 100644 --- a/crates/parser/test_data/parser/ok/0043_complex_assignment.rast +++ b/crates/parser/test_data/parser/ok/0043_complex_assignment.rast @@ -1,20 +1,14 @@ SOURCE_FILE - COMMENT "// https://github.com/rust-lang/rust-analyzer/issues/674" - WHITESPACE "\n\n" STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [COMMENT("// https://github.com/rust-lang/rust-analyzer/issues/674"), NEWLINE("\n"), NEWLINE("\n")] [WHITESPACE(" ")] NAME - IDENT "Repr" - WHITESPACE " " + IDENT "Repr" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_FIELD NAME IDENT "raw" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] ARRAY_TYPE L_BRACK "[" PATH_TYPE @@ -22,28 +16,22 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "u8" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] CONST_ARG LITERAL INT_NUMBER "1" - R_BRACK "]" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n\n" + R_BRACK "]" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "abc" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR INDEX_EXPR @@ -52,22 +40,18 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "Repr" - WHITESPACE " " + IDENT "Repr" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD NAME_REF IDENT "raw" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] ARRAY_EXPR L_BRACK "[" LITERAL INT_NUMBER "0" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] R_CURLY "}" DOT "." NAME_REF @@ -75,21 +59,18 @@ SOURCE_FILE L_BRACK "[" LITERAL INT_NUMBER "0" - R_BRACK "]" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "Repr" + IDENT "Repr" [WHITESPACE(" ")] [] RECORD_EXPR_FIELD_LIST L_CURLY "{" RECORD_EXPR_FIELD @@ -105,7 +86,6 @@ SOURCE_FILE ARG_LIST L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0044_let_attrs.rast b/crates/parser/test_data/parser/ok/0044_let_attrs.rast index fcdc1a9895d8..43035f9806fd 100644 --- a/crates/parser/test_data/parser/ok/0044_let_attrs.rast +++ b/crates/parser/test_data/parser/ok/0044_let_attrs.rast @@ -1,43 +1,32 @@ SOURCE_FILE FN - COMMENT "// https://github.com/rust-lang/rust-analyzer/issues/677" - WHITESPACE "\n" - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [COMMENT("// https://github.com/rust-lang/rust-analyzer/issues/677"), NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] L_BRACK "[" CFG_META CFG_KW "cfg" L_PAREN "(" CFG_ATOM - IDENT "feature" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "feature" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] STRING "\"backtrace\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " - LET_KW "let" - WHITESPACE " " + R_BRACK "]" [] [NEWLINE("\n")] + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "exit_code" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "exit_code" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -52,12 +41,10 @@ SOURCE_FILE ARG_LIST L_PAREN "(" CLOSURE_EXPR - MOVE_KW "move" - WHITESPACE " " + MOVE_KW "move" [] [WHITESPACE(" ")] PARAM_LIST PIPE "|" - PIPE "|" - WHITESPACE " " + PIPE "|" [] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -68,7 +55,6 @@ SOURCE_FILE L_PAREN "(" R_PAREN ")" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0045_block_attrs.rast b/crates/parser/test_data/parser/ok/0045_block_attrs.rast index 2dc22d12370e..67b6600b5635 100644 --- a/crates/parser/test_data/parser/ok/0045_block_attrs.rast +++ b/crates/parser/test_data/parser/ok/0045_block_attrs.rast @@ -1,19 +1,16 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "inner" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] BANG "!" L_BRACK "[" TOKEN_TREE_META @@ -25,18 +22,15 @@ SOURCE_FILE L_PAREN "(" STRING "\"Inner attributes allowed here\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " + R_BRACK "]" [] [NEWLINE("\n")] DOC_COMMENT - INNER_DOC_COMMENT "//! As are ModuleDoc style comments" - WHITESPACE "\n " + INNER_DOC_COMMENT "//! As are ModuleDoc style comments" [WHITESPACE(" ")] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [WHITESPACE(" ")] [NEWLINE("\n")] ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] BANG "!" L_BRACK "[" TOKEN_TREE_META @@ -48,10 +42,9 @@ SOURCE_FILE L_PAREN "(" STRING "\"Inner attributes are allowed in blocks used as statements\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " + R_BRACK "]" [] [NEWLINE("\n")] ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] BANG "!" L_BRACK "[" TOKEN_TREE_META @@ -63,20 +56,16 @@ SOURCE_FILE L_PAREN "(" STRING "\"Being validated is not affected by duplicates\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " + R_BRACK "]" [] [NEWLINE("\n")] DOC_COMMENT - INNER_DOC_COMMENT "//! As are ModuleDoc style comments" - WHITESPACE "\n " - R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + INNER_DOC_COMMENT "//! As are ModuleDoc style comments" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [WHITESPACE(" ")] [NEWLINE("\n")] ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] BANG "!" L_BRACK "[" TOKEN_TREE_META @@ -88,36 +77,26 @@ SOURCE_FILE L_PAREN "(" STRING "\"Inner attributes are allowed in blocks when they are the last statement of another block\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n " + R_BRACK "]" [] [NEWLINE("\n")] DOC_COMMENT - INNER_DOC_COMMENT "//! As are ModuleDoc style comments" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + INNER_DOC_COMMENT "//! As are ModuleDoc style comments" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "outer" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] BLOCK_EXPR ATTR POUND "#" @@ -131,32 +110,23 @@ SOURCE_FILE L_PAREN "(" STRING "\"Outer attributes are always allowed\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] IMPL - COMMENT "// https://github.com/rust-lang/rust-analyzer/issues/689" - WHITESPACE "\n" - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [NEWLINE("\n"), COMMENT("// https://github.com/rust-lang/rust-analyzer/issues/689"), NEWLINE("\n")] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Whatever" - WHITESPACE " " + IDENT "Whatever" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "salsa_event" PARAM_LIST @@ -165,17 +135,14 @@ SOURCE_FILE AMP "&" NAME SELF_KW "self" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT NAME IDENT "event_fn" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] IMPL_TRAIT_TYPE - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -185,11 +152,9 @@ SOURCE_FILE IDENT "Fn" PARENTHESIZED_ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -204,14 +169,12 @@ SOURCE_FILE NAME_REF SELF_TYPE_KW "Self" R_ANGLE ">" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] BANG "!" L_BRACK "[" TOKEN_TREE_META @@ -223,11 +186,7 @@ SOURCE_FILE L_PAREN "(" IDENT "unused_variables" R_PAREN ")" - R_BRACK "]" - WHITESPACE " " - COMMENT "// this is `inner_attr` of the block" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_BRACK "]" [] [WHITESPACE(" "), COMMENT("// this is `inner_attr` of the block"), NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0046_extern_inner_attributes.rast b/crates/parser/test_data/parser/ok/0046_extern_inner_attributes.rast index 8338f1416c04..f49f7abf9c7a 100644 --- a/crates/parser/test_data/parser/ok/0046_extern_inner_attributes.rast +++ b/crates/parser/test_data/parser/ok/0046_extern_inner_attributes.rast @@ -1,18 +1,14 @@ SOURCE_FILE EXTERN_BLOCK ABI - EXTERN_KW "extern" - WHITESPACE " " - STRING "\"C\"" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + STRING "\"C\"" [] [WHITESPACE(" ")] EXTERN_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] DOC_COMMENT - INNER_DOC_COMMENT "//! This is a doc comment" - WHITESPACE "\n " + INNER_DOC_COMMENT "//! This is a doc comment" [WHITESPACE(" ")] [NEWLINE("\n")] ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] BANG "!" L_BRACK "[" TOKEN_TREE_META @@ -24,7 +20,6 @@ SOURCE_FILE L_PAREN "(" STRING "\"This is also a doc comment\"" R_PAREN ")" - R_BRACK "]" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0047_minus_in_inner_pattern.rast b/crates/parser/test_data/parser/ok/0047_minus_in_inner_pattern.rast index c7eb3687deec..e4cbdf0a2253 100644 --- a/crates/parser/test_data/parser/ok/0047_minus_in_inner_pattern.rast +++ b/crates/parser/test_data/parser/ok/0047_minus_in_inner_pattern.rast @@ -1,23 +1,17 @@ SOURCE_FILE - COMMENT "// https://github.com/rust-lang/rust-analyzer/issues/972" - WHITESPACE "\n\n" FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [COMMENT("// https://github.com/rust-lang/rust-analyzer/issues/972"), NEWLINE("\n"), NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -30,48 +24,38 @@ SOURCE_FILE MINUS "-" LITERAL INT_NUMBER "1" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM TUPLE_STRUCT_PAT PATH PATH_SEGMENT NAME_REF - IDENT "Some" + IDENT "Some" [WHITESPACE(" ")] [] L_PAREN "(" LITERAL_PAT MINUS "-" LITERAL INT_NUMBER "1" - R_PAREN ")" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -86,24 +70,21 @@ SOURCE_FILE MINUS "-" LITERAL INT_NUMBER "1" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PREFIX_EXPR MINUS "-" LITERAL INT_NUMBER "1" R_PAREN ")" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM TUPLE_STRUCT_PAT PATH PATH_SEGMENT NAME_REF - IDENT "Some" + IDENT "Some" [WHITESPACE(" ")] [] L_PAREN "(" TUPLE_PAT L_PAREN "(" @@ -111,39 +92,30 @@ SOURCE_FILE MINUS "-" LITERAL INT_NUMBER "1" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LITERAL_PAT MINUS "-" LITERAL INT_NUMBER "1" R_PAREN ")" - R_PAREN ")" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] EXPR_STMT MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -161,24 +133,21 @@ SOURCE_FILE MINUS "-" LITERAL INT_NUMBER "1" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PREFIX_EXPR MINUS "-" LITERAL INT_NUMBER "1" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_ARM TUPLE_STRUCT_PAT PATH PATH PATH_SEGMENT NAME_REF - IDENT "A" + IDENT "A" [WHITESPACE(" ")] [] COLON2 "::" PATH_SEGMENT NAME_REF @@ -188,40 +157,30 @@ SOURCE_FILE MINUS "-" LITERAL INT_NUMBER "1" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LITERAL_PAT MINUS "-" LITERAL INT_NUMBER "1" - R_PAREN ")" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " + COMMA "," [] [NEWLINE("\n")] MATCH_ARM WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + FAT_ARROW "=>" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n\n " + COMMA "," [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] LET_EXPR - LET_KW "let" - WHITESPACE " " + LET_KW "let" [] [WHITESPACE(" ")] TUPLE_STRUCT_PAT PATH PATH_SEGMENT @@ -232,10 +191,8 @@ SOURCE_FILE MINUS "-" LITERAL INT_NUMBER "1" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -248,28 +205,21 @@ SOURCE_FILE MINUS "-" LITERAL INT_NUMBER "1" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] ENUM - ENUM_KW "enum" - WHITESPACE " " + ENUM_KW "enum" [NEWLINE("\n")] [WHITESPACE(" ")] NAME - IDENT "A" - WHITESPACE " " + IDENT "A" [] [WHITESPACE(" ")] VARIANT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] VARIANT NAME - IDENT "B" + IDENT "B" [WHITESPACE(" ")] [] TUPLE_FIELD_LIST L_PAREN "(" TUPLE_FIELD @@ -278,21 +228,17 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "i8" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TUPLE_FIELD PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i8" - R_PAREN ")" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + R_PAREN ")" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST @@ -307,17 +253,15 @@ SOURCE_FILE LITERAL_PAT LITERAL INT_NUMBER "127" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i8" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0048_compound_assignment.rast b/crates/parser/test_data/parser/ok/0048_compound_assignment.rast index e0f163b1a1f8..8833bec6338a 100644 --- a/crates/parser/test_data/parser/ok/0048_compound_assignment.rast +++ b/crates/parser/test_data/parser/ok/0048_compound_assignment.rast @@ -1,201 +1,155 @@ SOURCE_FILE - COMMENT "// https://github.com/rust-lang/rust-analyzer/pull/983" - WHITESPACE "\n\n" FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [COMMENT("// https://github.com/rust-lang/rust-analyzer/pull/983"), NEWLINE("\n"), NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "compound_assignment" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] NAME - IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "a" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - PLUSEQ "+=" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [WHITESPACE(" ")] + PLUSEQ "+=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - MINUSEQ "-=" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [WHITESPACE(" ")] + MINUSEQ "-=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - STAREQ "*=" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [WHITESPACE(" ")] + STAREQ "*=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "3" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - PERCENTEQ "%=" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [WHITESPACE(" ")] + PERCENTEQ "%=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "4" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - SLASHEQ "/=" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [WHITESPACE(" ")] + SLASHEQ "/=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "5" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - PIPEEQ "|=" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [WHITESPACE(" ")] + PIPEEQ "|=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "6" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - AMPEQ "&=" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [WHITESPACE(" ")] + AMPEQ "&=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "7" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - CARETEQ "^=" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [WHITESPACE(" ")] + CARETEQ "^=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "8" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - LTEQ "<=" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [WHITESPACE(" ")] + LTEQ "<=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "9" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - GTEQ ">=" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [WHITESPACE(" ")] + GTEQ ">=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "10" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - SHREQ ">>=" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [WHITESPACE(" ")] + SHREQ ">>=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "11" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "a" - WHITESPACE " " - SHLEQ "<<=" - WHITESPACE " " + IDENT "a" [WHITESPACE(" ")] [WHITESPACE(" ")] + SHLEQ "<<=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "12" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0049_async_block.rast b/crates/parser/test_data/parser/ok/0049_async_block.rast index f376821e285a..d7da44d6fee9 100644 --- a/crates/parser/test_data/parser/ok/0049_async_block.rast +++ b/crates/parser/test_data/parser/ok/0049_async_block.rast @@ -1,36 +1,28 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR - ASYNC_KW "async" - WHITESPACE " " + ASYNC_KW "async" [WHITESPACE(" ")] [WHITESPACE(" ")] STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR - ASYNC_KW "async" - WHITESPACE " " - MOVE_KW "move" - WHITESPACE " " + ASYNC_KW "async" [WHITESPACE(" ")] [WHITESPACE(" ")] + MOVE_KW "move" [] [WHITESPACE(" ")] STMT_LIST L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" [NEWLINE("\n")] [] diff --git a/crates/parser/test_data/parser/ok/0050_async_block_as_argument.rast b/crates/parser/test_data/parser/ok/0050_async_block_as_argument.rast index 53ddf35ccb4d..b4efd86212d4 100644 --- a/crates/parser/test_data/parser/ok/0050_async_block_as_argument.rast +++ b/crates/parser/test_data/parser/ok/0050_async_block_as_argument.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST @@ -10,11 +9,9 @@ SOURCE_FILE IDENT_PAT NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] IMPL_TRAIT_TYPE - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -36,57 +33,45 @@ SOURCE_FILE L_ANGLE "<" ASSOC_TYPE_ARG NAME_REF - IDENT "Output" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Output" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" R_ANGLE ">" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "foo" + IDENT "foo" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" BLOCK_EXPR - ASYNC_KW "async" - WHITESPACE " " - MOVE_KW "move" - WHITESPACE " " + ASYNC_KW "async" [] [WHITESPACE(" ")] + MOVE_KW "move" [] [WHITESPACE(" ")] STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] LITERAL - INT_NUMBER "12" - WHITESPACE " " + INT_NUMBER "12" [] [WHITESPACE(" ")] R_CURLY "}" - R_PAREN ")" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0051_parameter_attrs.rast b/crates/parser/test_data/parser/ok/0051_parameter_attrs.rast index 24d4392282a0..630946bae05b 100644 --- a/crates/parser/test_data/parser/ok/0051_parameter_attrs.rast +++ b/crates/parser/test_data/parser/ok/0051_parameter_attrs.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "g1" PARAM_LIST @@ -15,8 +14,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr1" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] ATTR POUND "#" L_BRACK "[" @@ -25,28 +23,23 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr2" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "pat" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Type" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "g2" PARAM_LIST @@ -60,37 +53,29 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr1" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u8" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n\n" + R_CURLY "}" [] [NEWLINE("\n")] EXTERN_BLOCK ABI - EXTERN_KW "extern" - WHITESPACE " " - STRING "\"C\"" - WHITESPACE " " + EXTERN_KW "extern" [NEWLINE("\n")] [WHITESPACE(" ")] + STRING "\"C\"" [] [WHITESPACE(" ")] EXTERN_ITEM_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "printf" PARAM_LIST @@ -99,19 +84,16 @@ SOURCE_FILE IDENT_PAT NAME IDENT "format" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i8" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM ATTR POUND "#" @@ -121,35 +103,26 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] DOT3 "..." - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - SEMICOLON ";" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] TRAIT - TRAIT_KW "trait" - WHITESPACE " " + TRAIT_KW "trait" [NEWLINE("\n")] [WHITESPACE(" ")] NAME - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "bar" PARAM_LIST @@ -163,63 +136,50 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u64" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM ATTR - POUND "#" - WHITESPACE " " + POUND "#" [] [WHITESPACE(" ")] L_BRACK "[" PATH_META PATH PATH_SEGMENT NAME_REF IDENT "attr" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] IDENT_PAT - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [NEWLINE("\n")] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST @@ -233,20 +193,16 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "must_use" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] NAME SELF_KW "self" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "g1" PARAM_LIST @@ -260,20 +216,16 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] NAME SELF_KW "self" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "g2" PARAM_LIST @@ -287,21 +239,17 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] AMP "&" NAME SELF_KW "self" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "g3" GENERIC_PARAM_LIST @@ -321,23 +269,18 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] AMP "&" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] NAME SELF_KW "self" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "g4" GENERIC_PARAM_LIST @@ -357,24 +300,19 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] NAME SELF_KW "self" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "g5" GENERIC_PARAM_LIST @@ -394,26 +332,20 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " - MUT_KW "mut" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] + MUT_KW "mut" [] [WHITESPACE(" ")] NAME SELF_KW "self" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "c" PARAM_LIST @@ -427,27 +359,22 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] NAME SELF_KW "self" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF SELF_TYPE_KW "Self" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "d" PARAM_LIST @@ -461,12 +388,10 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "attr" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] NAME SELF_KW "self" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -481,11 +406,10 @@ SOURCE_FILE NAME_REF SELF_TYPE_KW "Self" R_ANGLE ">" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] R_CURLY "}" + EOF "" diff --git a/crates/parser/test_data/parser/ok/0052_for_range_block.rast b/crates/parser/test_data/parser/ok/0052_for_range_block.rast index 0c9dd432fb46..cf01e6c08965 100644 --- a/crates/parser/test_data/parser/ok/0052_for_range_block.rast +++ b/crates/parser/test_data/parser/ok/0052_for_range_block.rast @@ -1,50 +1,38 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FOR_EXPR - FOR_KW "for" - WHITESPACE " " + FOR_KW "for" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "_x" - WHITESPACE " " - IN_KW "in" - WHITESPACE " " + IDENT "_x" [] [WHITESPACE(" ")] + IN_KW "in" [] [WHITESPACE(" ")] RANGE_EXPR LITERAL - INT_NUMBER "0" - WHITESPACE " " - DOT2 ".." - WHITESPACE " " + INT_NUMBER "0" [] [WHITESPACE(" ")] + DOT2 ".." [] [WHITESPACE(" ")] METHOD_CALL_EXPR PAREN_EXPR L_PAREN "(" RANGE_EXPR LITERAL - INT_NUMBER "0" - WHITESPACE " " - DOT2 ".." - WHITESPACE " " + INT_NUMBER "0" [] [WHITESPACE(" ")] + DOT2 ".." [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" R_CURLY "}" @@ -64,18 +52,14 @@ SOURCE_FILE R_ANGLE ">" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BREAK_EXPR - BREAK_KW "break" - SEMICOLON ";" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + BREAK_KW "break" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0053_outer_attribute_on_macro_rules.rast b/crates/parser/test_data/parser/ok/0053_outer_attribute_on_macro_rules.rast index c9eeda6582af..2633a036bce9 100644 --- a/crates/parser/test_data/parser/ok/0053_outer_attribute_on_macro_rules.rast +++ b/crates/parser/test_data/parser/ok/0053_outer_attribute_on_macro_rules.rast @@ -1,8 +1,7 @@ SOURCE_FILE MACRO_RULES DOC_COMMENT - OUTER_DOC_COMMENT "/// Some docs" - WHITESPACE "\n" + OUTER_DOC_COMMENT "/// Some docs" [] [NEWLINE("\n")] ATTR POUND "#" L_BRACK "[" @@ -11,28 +10,21 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "macro_export" - R_BRACK "]" - WHITESPACE "\n" + R_BRACK "]" [] [NEWLINE("\n")] MACRO_RULES_KW "macro_rules" - BANG "!" - WHITESPACE " " + BANG "!" [] [WHITESPACE(" ")] NAME - IDENT "foo" - WHITESPACE " " + IDENT "foo" [] [WHITESPACE(" ")] TOKEN_TREE - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] TOKEN_TREE - L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + L_PAREN "(" [WHITESPACE(" ")] [] + R_PAREN ")" [] [WHITESPACE(" ")] EQ "=" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] TOKEN_TREE L_CURLY "{" R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0054_qual_path_in_type_arg.rast b/crates/parser/test_data/parser/ok/0054_qual_path_in_type_arg.rast index 31cca601ca22..c83a24276fe9 100644 --- a/crates/parser/test_data/parser/ok/0054_qual_path_in_type_arg.rast +++ b/crates/parser/test_data/parser/ok/0054_qual_path_in_type_arg.rast @@ -1,16 +1,13 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "a" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -29,16 +26,13 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Baz" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "b" PARAM_LIST @@ -46,11 +40,9 @@ SOURCE_FILE PARAM WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] IMPL_TRAIT_TYPE - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -72,16 +64,13 @@ SOURCE_FILE NAME_REF IDENT "Y" R_PAREN ")" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "c" PARAM_LIST @@ -89,11 +78,9 @@ SOURCE_FILE PARAM WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] IMPL_TRAIT_TYPE - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -117,10 +104,9 @@ SOURCE_FILE NAME_REF IDENT "Y" R_PAREN ")" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0055_dot_dot_dot.rast b/crates/parser/test_data/parser/ok/0055_dot_dot_dot.rast index 684f499df5c5..468d74204421 100644 --- a/crates/parser/test_data/parser/ok/0055_dot_dot_dot.rast +++ b/crates/parser/test_data/parser/ok/0055_dot_dot_dot.rast @@ -1,33 +1,25 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "X" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "X" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n" + SEMICOLON ";" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_PAT L_PAREN "(" R_PAREN ")" @@ -37,14 +29,11 @@ SOURCE_FILE PATH_SEGMENT COLON2 "::" NAME_REF - IDENT "X" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "X" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0056_neq_in_type.rast b/crates/parser/test_data/parser/ok/0056_neq_in_type.rast index 55ce31275fba..c8acea5f388d 100644 --- a/crates/parser/test_data/parser/ok/0056_neq_in_type.rast +++ b/crates/parser/test_data/parser/ok/0056_neq_in_type.rast @@ -1,20 +1,16 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] IF_EXPR - IF_KW "if" - WHITESPACE " " + IF_KW "if" [WHITESPACE(" ")] [WHITESPACE(" ")] BIN_EXPR CAST_EXPR METHOD_CALL_EXPR @@ -25,18 +21,14 @@ SOURCE_FILE IDENT "floor" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i64" - WHITESPACE " " - NEQ "!=" - WHITESPACE " " + IDENT "i64" [] [WHITESPACE(" ")] + NEQ "!=" [] [WHITESPACE(" ")] CAST_EXPR METHOD_CALL_EXPR LITERAL @@ -46,20 +38,16 @@ SOURCE_FILE IDENT "floor" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i64" - WHITESPACE " " + IDENT "i64" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0057_loop_in_call.rast b/crates/parser/test_data/parser/ok/0057_loop_in_call.rast index 67837e4750cb..f1b381f6ecd8 100644 --- a/crates/parser/test_data/parser/ok/0057_loop_in_call.rast +++ b/crates/parser/test_data/parser/ok/0057_loop_in_call.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST @@ -10,50 +9,43 @@ SOURCE_FILE IDENT_PAT NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "foo" + IDENT "foo" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" LOOP_EXPR - LOOP_KW "loop" - WHITESPACE " " + LOOP_KW "loop" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] R_CURLY "}" + EOF "" diff --git a/crates/parser/test_data/parser/ok/0058_unary_expr_precedence.rast b/crates/parser/test_data/parser/ok/0058_unary_expr_precedence.rast index 683d5070aee7..c567dc3ee493 100644 --- a/crates/parser/test_data/parser/ok/0058_unary_expr_precedence.rast +++ b/crates/parser/test_data/parser/ok/0058_unary_expr_precedence.rast @@ -1,59 +1,48 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + INT_NUMBER "1" [WHITESPACE(" ")] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] PREFIX_EXPR STAR "*" REF_EXPR AMP "&" LITERAL - INT_NUMBER "2" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + INT_NUMBER "2" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "3" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CAST_EXPR PREFIX_EXPR - STAR "*" + STAR "*" [WHITESPACE(" ")] [] REF_EXPR AMP "&" LITERAL - INT_NUMBER "1" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + INT_NUMBER "1" [] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u64" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT PREFIX_EXPR - STAR "*" + STAR "*" [WHITESPACE(" ")] [] CALL_EXPR PATH_EXPR PATH @@ -65,11 +54,10 @@ SOURCE_FILE LITERAL INT_NUMBER "1" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT REF_EXPR - AMP "&" + AMP "&" [WHITESPACE(" ")] [] INDEX_EXPR PATH_EXPR PATH @@ -80,18 +68,16 @@ SOURCE_FILE LITERAL INT_NUMBER "1" R_BRACK "]" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT RANGE_EXPR PREFIX_EXPR - MINUS "-" + MINUS "-" [WHITESPACE(" ")] [] LITERAL INT_NUMBER "1" DOT2 ".." LITERAL INT_NUMBER "2" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0059_loops_in_parens.rast b/crates/parser/test_data/parser/ok/0059_loops_in_parens.rast index 79bc7f971d18..98c307dd9977 100644 --- a/crates/parser/test_data/parser/ok/0059_loops_in_parens.rast +++ b/crates/parser/test_data/parser/ok/0059_loops_in_parens.rast @@ -1,34 +1,28 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "Some" + IDENT "Some" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" FOR_EXPR - FOR_KW "for" - WHITESPACE " " + FOR_KW "for" [] [WHITESPACE(" ")] WILDCARD_PAT - UNDERSCORE "_" - WHITESPACE " " - IN_KW "in" - WHITESPACE " " + UNDERSCORE "_" [] [WHITESPACE(" ")] + IN_KW "in" [] [WHITESPACE(" ")] METHOD_CALL_EXPR ARRAY_EXPR L_BRACK "[" @@ -40,61 +34,52 @@ SOURCE_FILE IDENT "into_iter" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "Some" + IDENT "Some" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" LOOP_EXPR - LOOP_KW "loop" - WHITESPACE " " + LOOP_KW "loop" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] EXPR_STMT BREAK_EXPR BREAK_KW "break" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] R_CURLY "}" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT CALL_EXPR PATH_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "Some" + IDENT "Some" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" WHILE_EXPR - WHILE_KW "while" - WHITESPACE " " + WHILE_KW "while" [] [WHITESPACE(" ")] LITERAL - TRUE_KW "true" - WHITESPACE " " + TRUE_KW "true" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" R_CURLY "}" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0060_as_range.rast b/crates/parser/test_data/parser/ok/0060_as_range.rast index 81fc02b6f4ad..0aace694e4ef 100644 --- a/crates/parser/test_data/parser/ok/0060_as_range.rast +++ b/crates/parser/test_data/parser/ok/0060_as_range.rast @@ -1,56 +1,43 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT RANGE_EXPR CAST_EXPR LITERAL - INT_NUMBER "0" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + INT_NUMBER "0" [WHITESPACE(" ")] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "usize" - WHITESPACE " " + IDENT "usize" [] [WHITESPACE(" ")] DOT2 ".." - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT RANGE_EXPR BIN_EXPR LITERAL - INT_NUMBER "1" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + INT_NUMBER "1" [WHITESPACE(" ")] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] CAST_EXPR LITERAL - INT_NUMBER "2" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + INT_NUMBER "2" [] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "usize" - WHITESPACE " " + IDENT "usize" [] [WHITESPACE(" ")] DOT2 ".." - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0061_match_full_range.rast b/crates/parser/test_data/parser/ok/0061_match_full_range.rast index 2f56e9041ea0..a1c12a8634a1 100644 --- a/crates/parser/test_data/parser/ok/0061_match_full_range.rast +++ b/crates/parser/test_data/parser/ok/0061_match_full_range.rast @@ -1,27 +1,20 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MATCH_EXPR - MATCH_KW "match" - WHITESPACE " " + MATCH_KW "match" [WHITESPACE(" ")] [WHITESPACE(" ")] RANGE_EXPR - DOT2 ".." - WHITESPACE " " + DOT2 ".." [] [WHITESPACE(" ")] MATCH_ARM_LIST - L_CURLY "{" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0062_macro_2.0.rast b/crates/parser/test_data/parser/ok/0062_macro_2.0.rast index b92d78e5bd60..d0d18bb6f427 100644 --- a/crates/parser/test_data/parser/ok/0062_macro_2.0.rast +++ b/crates/parser/test_data/parser/ok/0062_macro_2.0.rast @@ -1,7 +1,6 @@ SOURCE_FILE MACRO_DEF - MACRO_KW "macro" - WHITESPACE " " + MACRO_KW "macro" [] [WHITESPACE(" ")] NAME IDENT "parse_use_trees" TOKEN_TREE @@ -15,25 +14,21 @@ SOURCE_FILE IDENT "expr" R_PAREN ")" COMMA "," - STAR "*" - WHITESPACE " " + STAR "*" [] [WHITESPACE(" ")] DOLLAR "$" TOKEN_TREE L_PAREN "(" COMMA "," R_PAREN ")" STAR "*" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] TOKEN_TREE - L_CURLY "{" - WHITESPACE "\n " - IDENT "vec" + L_CURLY "{" [] [NEWLINE("\n")] + IDENT "vec" [WHITESPACE(" ")] [] BANG "!" TOKEN_TREE - L_BRACK "[" - WHITESPACE "\n " - DOLLAR "$" + L_BRACK "[" [] [NEWLINE("\n")] + DOLLAR "$" [WHITESPACE(" ")] [] TOKEN_TREE L_PAREN "(" IDENT "parse_use_tree" @@ -44,38 +39,30 @@ SOURCE_FILE R_PAREN ")" COMMA "," R_PAREN ")" - STAR "*" - WHITESPACE "\n " - R_BRACK "]" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + STAR "*" [] [NEWLINE("\n")] + R_BRACK "]" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN ATTR - POUND "#" + POUND "#" [NEWLINE("\n")] [] L_BRACK "[" PATH_META PATH PATH_SEGMENT NAME_REF IDENT "test" - R_BRACK "]" - WHITESPACE "\n" - FN_KW "fn" - WHITESPACE " " + R_BRACK "]" [] [NEWLINE("\n")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "test_use_tree_merge" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] MACRO_DEF - MACRO_KW "macro" - WHITESPACE " " + MACRO_KW "macro" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "test_merge" TOKEN_TREE @@ -91,8 +78,7 @@ SOURCE_FILE IDENT "expr" R_PAREN ")" COMMA "," - STAR "*" - WHITESPACE " " + STAR "*" [] [WHITESPACE(" ")] DOLLAR "$" TOKEN_TREE L_PAREN "(" @@ -100,8 +86,7 @@ SOURCE_FILE R_PAREN ")" STAR "*" R_BRACK "]" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] TOKEN_TREE L_BRACK "[" DOLLAR "$" @@ -113,8 +98,7 @@ SOURCE_FILE IDENT "expr" R_PAREN ")" COMMA "," - STAR "*" - WHITESPACE " " + STAR "*" [] [WHITESPACE(" ")] DOLLAR "$" TOKEN_TREE L_PAREN "(" @@ -122,17 +106,14 @@ SOURCE_FILE R_PAREN ")" STAR "*" R_BRACK "]" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] TOKEN_TREE - L_CURLY "{" - WHITESPACE "\n " - IDENT "assert_eq" + L_CURLY "{" [] [NEWLINE("\n")] + IDENT "assert_eq" [WHITESPACE(" ")] [] BANG "!" TOKEN_TREE - L_PAREN "(" - WHITESPACE "\n " - IDENT "merge_use_trees" + L_PAREN "(" [] [NEWLINE("\n")] + IDENT "merge_use_trees" [WHITESPACE(" ")] [] TOKEN_TREE L_PAREN "(" IDENT "parse_use_trees" @@ -149,9 +130,8 @@ SOURCE_FILE STAR "*" R_PAREN ")" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - IDENT "parse_use_trees" + COMMA "," [] [NEWLINE("\n")] + IDENT "parse_use_trees" [WHITESPACE(" ")] [] BANG "!" TOKEN_TREE L_PAREN "(" @@ -164,12 +144,9 @@ SOURCE_FILE R_PAREN ")" STAR "*" R_PAREN ")" - COMMA "," - WHITESPACE "\n " - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] + R_PAREN ")" [WHITESPACE(" ")] [] + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0063_trait_fn_patterns.rast b/crates/parser/test_data/parser/ok/0063_trait_fn_patterns.rast index a86b21d27cdf..efe8171c342c 100644 --- a/crates/parser/test_data/parser/ok/0063_trait_fn_patterns.rast +++ b/crates/parser/test_data/parser/ok/0063_trait_fn_patterns.rast @@ -1,16 +1,12 @@ SOURCE_FILE TRAIT - TRAIT_KW "trait" - WHITESPACE " " + TRAIT_KW "trait" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "f1" PARAM_LIST @@ -21,14 +17,12 @@ SOURCE_FILE IDENT_PAT NAME IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "b" R_PAREN ")" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" PATH_TYPE @@ -36,24 +30,20 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "usize" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "usize" R_PAREN ")" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "f2" PARAM_LIST @@ -63,40 +53,32 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_PAT_FIELD IDENT_PAT NAME IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] RECORD_PAT_FIELD IDENT_PAT NAME - IDENT "b" - WHITESPACE " " + IDENT "b" [] [WHITESPACE(" ")] R_CURLY "}" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "S" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "f3" PARAM_LIST @@ -112,23 +94,19 @@ SOURCE_FILE NAME IDENT "a" R_PAREN ")" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "NewType" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "f4" PARAM_LIST @@ -141,8 +119,7 @@ SOURCE_FILE IDENT_PAT NAME IDENT "a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] REF_TYPE AMP "&" REF_TYPE @@ -152,16 +129,13 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "usize" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "bar" PARAM_LIST @@ -169,30 +143,25 @@ SOURCE_FILE PARAM WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u64" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM IDENT_PAT - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0063_variadic_fun.rast b/crates/parser/test_data/parser/ok/0063_variadic_fun.rast index f1c6d2efeb9c..6944aedab605 100644 --- a/crates/parser/test_data/parser/ok/0063_variadic_fun.rast +++ b/crates/parser/test_data/parser/ok/0063_variadic_fun.rast @@ -1,16 +1,12 @@ SOURCE_FILE EXTERN_BLOCK ABI - EXTERN_KW "extern" - WHITESPACE " " - STRING "\"C\"" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + STRING "\"C\"" [] [WHITESPACE(" ")] EXTERN_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "a" PARAM_LIST @@ -18,28 +14,23 @@ SOURCE_FILE PARAM WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u8" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM DOT3 "..." COMMA "," R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "b" PARAM_LIST @@ -47,31 +38,25 @@ SOURCE_FILE PARAM WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u8" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] DOT3 "..." R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "c" PARAM_LIST @@ -79,19 +64,16 @@ SOURCE_FILE PARAM WILDCARD_PAT UNDERSCORE "_" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "u8" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM ATTR POUND "#" @@ -102,30 +84,25 @@ SOURCE_FILE CFG_ATOM IDENT "never" R_PAREN ")" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] SLICE_PAT L_BRACK "[" IDENT_PAT NAME IDENT "w" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "t" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "f" R_BRACK "]" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] DOT3 "..." COMMA "," R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0064_impl_fn_params.rast b/crates/parser/test_data/parser/ok/0064_impl_fn_params.rast index 18cecc8108dd..776a21675978 100644 --- a/crates/parser/test_data/parser/ok/0064_impl_fn_params.rast +++ b/crates/parser/test_data/parser/ok/0064_impl_fn_params.rast @@ -1,19 +1,15 @@ SOURCE_FILE IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "U" - WHITESPACE " " + IDENT "U" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "f1" PARAM_LIST @@ -24,14 +20,12 @@ SOURCE_FILE IDENT_PAT NAME IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "b" R_PAREN ")" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" PATH_TYPE @@ -39,24 +33,20 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "usize" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "usize" R_PAREN ")" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "f2" PARAM_LIST @@ -66,40 +56,32 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_PAT_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_PAT_FIELD IDENT_PAT NAME IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] RECORD_PAT_FIELD IDENT_PAT NAME - IDENT "b" - WHITESPACE " " + IDENT "b" [] [WHITESPACE(" ")] R_CURLY "}" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "S" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "f3" PARAM_LIST @@ -115,23 +97,19 @@ SOURCE_FILE NAME IDENT "a" R_PAREN ")" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "NewType" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME IDENT "f4" PARAM_LIST @@ -144,8 +122,7 @@ SOURCE_FILE IDENT_PAT NAME IDENT "a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] REF_TYPE AMP "&" REF_TYPE @@ -155,12 +132,10 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "usize" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0065_comment_newline.rast b/crates/parser/test_data/parser/ok/0065_comment_newline.rast index e95ed7d38c90..995225db3776 100644 --- a/crates/parser/test_data/parser/ok/0065_comment_newline.rast +++ b/crates/parser/test_data/parser/ok/0065_comment_newline.rast @@ -1,18 +1,15 @@ SOURCE_FILE FN DOC_COMMENT - OUTER_DOC_COMMENT "/// Example" - WHITESPACE "\n\n" - FN_KW "fn" - WHITESPACE " " + OUTER_DOC_COMMENT "/// Example" [] [NEWLINE("\n")] + FN_KW "fn" [NEWLINE("\n")] [WHITESPACE(" ")] NAME IDENT "test" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0065_plus_after_fn_trait_bound.rast b/crates/parser/test_data/parser/ok/0065_plus_after_fn_trait_bound.rast index d7ee11077cd4..3af1e191b76f 100644 --- a/crates/parser/test_data/parser/ok/0065_plus_after_fn_trait_bound.rast +++ b/crates/parser/test_data/parser/ok/0065_plus_after_fn_trait_bound.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" GENERIC_PARAM_LIST @@ -12,19 +11,16 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE " " + WHERE_KW "where" [] [WHITESPACE(" ")] WHERE_PRED PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "T" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -34,28 +30,23 @@ SOURCE_FILE IDENT "Fn" PARENTHESIZED_ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u8" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "u8" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Send" - WHITESPACE " " + IDENT "Send" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0066_default_modifier.rast b/crates/parser/test_data/parser/ok/0066_default_modifier.rast index a4303098a282..9cb12ece913b 100644 --- a/crates/parser/test_data/parser/ok/0066_default_modifier.rast +++ b/crates/parser/test_data/parser/ok/0066_default_modifier.rast @@ -1,222 +1,160 @@ SOURCE_FILE TRAIT - TRAIT_KW "trait" - WHITESPACE " " + TRAIT_KW "trait" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] TYPE_ALIAS - DEFAULT_KW "default" - WHITESPACE " " - TYPE_KW "type" - WHITESPACE " " + DEFAULT_KW "default" [WHITESPACE(" ")] [WHITESPACE(" ")] + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Bar" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] CONST - DEFAULT_KW "default" - WHITESPACE " " - CONST_KW "const" - WHITESPACE " " + DEFAULT_KW "default" [WHITESPACE(" ")] [WHITESPACE(" ")] + CONST_KW "const" [] [WHITESPACE(" ")] NAME IDENT "f" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u8" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "u8" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN - DEFAULT_KW "default" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + DEFAULT_KW "default" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - DEFAULT_KW "default" - WHITESPACE " " - UNSAFE_KW "unsafe" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + DEFAULT_KW "default" [WHITESPACE(" ")] [WHITESPACE(" ")] + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "bar" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] IMPL - IMPL_KW "impl" - WHITESPACE " " + IMPL_KW "impl" [NEWLINE("\n")] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "T" - WHITESPACE " " - FOR_KW "for" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + FOR_KW "for" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] TYPE_ALIAS - DEFAULT_KW "default" - WHITESPACE " " - TYPE_KW "type" - WHITESPACE " " + DEFAULT_KW "default" [WHITESPACE(" ")] [WHITESPACE(" ")] + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Bar" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] CONST - DEFAULT_KW "default" - WHITESPACE " " - CONST_KW "const" - WHITESPACE " " + DEFAULT_KW "default" [WHITESPACE(" ")] [WHITESPACE(" ")] + CONST_KW "const" [] [WHITESPACE(" ")] NAME IDENT "f" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "u8" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "u8" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN - DEFAULT_KW "default" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + DEFAULT_KW "default" [WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n " + R_CURLY "}" [] [NEWLINE("\n")] FN - DEFAULT_KW "default" - WHITESPACE " " - UNSAFE_KW "unsafe" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + DEFAULT_KW "default" [WHITESPACE(" ")] [WHITESPACE(" ")] + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "bar" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n\n" + R_CURLY "}" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] IMPL - DEFAULT_KW "default" - WHITESPACE " " - IMPL_KW "impl" - WHITESPACE " " + DEFAULT_KW "default" [NEWLINE("\n")] [WHITESPACE(" ")] + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "T" - WHITESPACE " " - FOR_KW "for" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + FOR_KW "for" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] IMPL - DEFAULT_KW "default" - WHITESPACE " " - UNSAFE_KW "unsafe" - WHITESPACE " " - IMPL_KW "impl" - WHITESPACE " " + DEFAULT_KW "default" [] [WHITESPACE(" ")] + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "T" - WHITESPACE " " - FOR_KW "for" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + FOR_KW "for" [] [WHITESPACE(" ")] TUPLE_TYPE L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0067_where_for_pred.rast b/crates/parser/test_data/parser/ok/0067_where_for_pred.rast index 5cef4dff062a..03135261f2fb 100644 --- a/crates/parser/test_data/parser/ok/0067_where_for_pred.rast +++ b/crates/parser/test_data/parser/ok/0067_where_for_pred.rast @@ -1,7 +1,6 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "for_trait" GENERIC_PARAM_LIST @@ -12,28 +11,24 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE "\n " + WHERE_KW "where" [] [NEWLINE("\n")] WHERE_PRED FOR_BINDER - FOR_KW "for" + FOR_KW "for" [WHITESPACE(" ")] [] GENERIC_PARAM_LIST L_ANGLE "<" LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "F" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -47,25 +42,20 @@ SOURCE_FILE REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "str" R_PAREN ")" - COMMA "," - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "for_ref" GENERIC_PARAM_LIST @@ -76,33 +66,28 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE "\n " + WHERE_KW "where" [] [NEWLINE("\n")] WHERE_PRED FOR_BINDER - FOR_KW "for" + FOR_KW "for" [WHITESPACE(" ")] [] GENERIC_PARAM_LIST L_ANGLE "<" LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "F" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -110,17 +95,13 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Debug" - COMMA "," - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "for_parens" GENERIC_PARAM_LIST @@ -131,36 +112,31 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE "\n " + WHERE_KW "where" [] [NEWLINE("\n")] WHERE_PRED FOR_BINDER - FOR_KW "for" + FOR_KW "for" [WHITESPACE(" ")] [] GENERIC_PARAM_LIST L_ANGLE "<" LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] PAREN_TYPE L_PAREN "(" REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "F" R_PAREN ")" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -174,25 +150,20 @@ SOURCE_FILE REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "str" R_PAREN ")" - COMMA "," - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "for_slice" GENERIC_PARAM_LIST @@ -203,36 +174,31 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE "\n " + WHERE_KW "where" [] [NEWLINE("\n")] WHERE_PRED FOR_BINDER - FOR_KW "for" + FOR_KW "for" [WHITESPACE(" ")] [] GENERIC_PARAM_LIST L_ANGLE "<" LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] SLICE_TYPE L_BRACK "[" REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "F" R_BRACK "]" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -240,17 +206,13 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Eq" - COMMA "," - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "for_qpath" GENERIC_PARAM_LIST @@ -265,8 +227,7 @@ SOURCE_FILE IDENT_PAT NAME IDENT "_t" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] REF_TYPE AMP "&" PATH_TYPE @@ -274,21 +235,18 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "T" - R_PAREN ")" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE "\n " + WHERE_KW "where" [] [NEWLINE("\n")] WHERE_PRED FOR_BINDER - FOR_KW "for" + FOR_KW "for" [WHITESPACE(" ")] [] GENERIC_PARAM_LIST L_ANGLE "<" LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH @@ -298,16 +256,13 @@ SOURCE_FILE REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "T" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -318,8 +273,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Foo" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -327,17 +281,13 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Iterator" - COMMA "," - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "for_for_fn" GENERIC_PARAM_LIST @@ -348,21 +298,18 @@ SOURCE_FILE R_ANGLE ">" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] WHERE_CLAUSE - WHERE_KW "where" - WHITESPACE "\n " + WHERE_KW "where" [] [NEWLINE("\n")] WHERE_PRED FOR_BINDER - FOR_KW "for" + FOR_KW "for" [WHITESPACE(" ")] [] GENERIC_PARAM_LIST L_ANGLE "<" LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] FOR_TYPE FOR_BINDER FOR_KW "for" @@ -371,8 +318,7 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'b" - R_ANGLE ">" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] FN_PTR_TYPE FN_KW "fn" PARAM_LIST @@ -381,29 +327,25 @@ SOURCE_FILE REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "T" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PARAM REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'b" - WHITESPACE " " + LIFETIME_IDENT "'b" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "T" R_PAREN ")" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -411,11 +353,9 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Copy" - COMMA "," - WHITESPACE "\n" + COMMA "," [] [NEWLINE("\n")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + L_CURLY "{" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0068_item_modifiers.rast b/crates/parser/test_data/parser/ok/0068_item_modifiers.rast index 41fc5691ad77..830fc38f8131 100644 --- a/crates/parser/test_data/parser/ok/0068_item_modifiers.rast +++ b/crates/parser/test_data/parser/ok/0068_item_modifiers.rast @@ -1,238 +1,172 @@ SOURCE_FILE FN - ASYNC_KW "async" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + ASYNC_KW "async" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN ABI - EXTERN_KW "extern" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - CONST_KW "const" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - CONST_KW "const" - WHITESPACE " " - UNSAFE_KW "unsafe" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - UNSAFE_KW "unsafe" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] ABI - EXTERN_KW "extern" - WHITESPACE " " - STRING "\"C\"" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + STRING "\"C\"" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - UNSAFE_KW "unsafe" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - ASYNC_KW "async" - WHITESPACE " " - UNSAFE_KW "unsafe" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + ASYNC_KW "async" [] [WHITESPACE(" ")] + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] FN - CONST_KW "const" - WHITESPACE " " - UNSAFE_KW "unsafe" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "bar" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n\n" + R_CURLY "}" [] [NEWLINE("\n")] TRAIT - UNSAFE_KW "unsafe" - WHITESPACE " " - TRAIT_KW "trait" - WHITESPACE " " + UNSAFE_KW "unsafe" [NEWLINE("\n")] [WHITESPACE(" ")] + TRAIT_KW "trait" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] TRAIT - AUTO_KW "auto" - WHITESPACE " " - TRAIT_KW "trait" - WHITESPACE " " + AUTO_KW "auto" [] [WHITESPACE(" ")] + TRAIT_KW "trait" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] TRAIT - UNSAFE_KW "unsafe" - WHITESPACE " " - AUTO_KW "auto" - WHITESPACE " " - TRAIT_KW "trait" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] + AUTO_KW "auto" [] [WHITESPACE(" ")] + TRAIT_KW "trait" [] [WHITESPACE(" ")] NAME - IDENT "T" - WHITESPACE " " + IDENT "T" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n\n" + R_CURLY "}" [] [NEWLINE("\n")] IMPL - UNSAFE_KW "unsafe" - WHITESPACE " " - IMPL_KW "impl" - WHITESPACE " " + UNSAFE_KW "unsafe" [NEWLINE("\n")] [WHITESPACE(" ")] + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] IMPL - DEFAULT_KW "default" - WHITESPACE " " - IMPL_KW "impl" - WHITESPACE " " + DEFAULT_KW "default" [] [WHITESPACE(" ")] + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] IMPL - UNSAFE_KW "unsafe" - WHITESPACE " " - DEFAULT_KW "default" - WHITESPACE " " - IMPL_KW "impl" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] + DEFAULT_KW "default" [] [WHITESPACE(" ")] + IMPL_KW "impl" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Foo" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] ASSOC_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n\n" + R_CURLY "}" [] [NEWLINE("\n")] EXTERN_BLOCK - UNSAFE_KW "unsafe" - WHITESPACE " " + UNSAFE_KW "unsafe" [NEWLINE("\n")] [WHITESPACE(" ")] ABI - EXTERN_KW "extern" - WHITESPACE " " - STRING "\"C++\"" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] + STRING "\"C++\"" [] [WHITESPACE(" ")] EXTERN_ITEM_LIST L_CURLY "{" - R_CURLY "}" - WHITESPACE "\n" + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0069_multi_trait_object.rast b/crates/parser/test_data/parser/ok/0069_multi_trait_object.rast index 9e8f4e197408..534c4cbf6622 100644 --- a/crates/parser/test_data/parser/ok/0069_multi_trait_object.rast +++ b/crates/parser/test_data/parser/ok/0069_multi_trait_object.rast @@ -1,7 +1,6 @@ SOURCE_FILE TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME IDENT "Foo" GENERIC_PARAM_LIST @@ -9,30 +8,24 @@ SOURCE_FILE LIFETIME_PARAM LIFETIME LIFETIME_IDENT "'a" - R_ANGLE ">" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] REF_TYPE AMP "&" LIFETIME - LIFETIME_IDENT "'a" - WHITESPACE " " + LIFETIME_IDENT "'a" [] [WHITESPACE(" ")] PAREN_TYPE L_PAREN "(" DYN_TRAIT_TYPE - DYN_KW "dyn" - WHITESPACE " " + DYN_KW "dyn" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Send" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "Send" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH @@ -40,35 +33,27 @@ SOURCE_FILE NAME_REF IDENT "Sync" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "Foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] PAREN_TYPE L_PAREN "(" DYN_TRAIT_TYPE - DYN_KW "dyn" - WHITESPACE " " + DYN_KW "dyn" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Send" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "Send" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH @@ -76,68 +61,52 @@ SOURCE_FILE NAME_REF IDENT "Sync" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " + TYPE_KW "type" [] [WHITESPACE(" ")] NAME - IDENT "Foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Foo" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] FN_PTR_TYPE FN_KW "fn" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PAREN_TYPE L_PAREN "(" DYN_TRAIT_TYPE - DYN_KW "dyn" - WHITESPACE " " + DYN_KW "dyn" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "Send" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + IDENT "Send" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND LIFETIME LIFETIME_IDENT "'static" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "main" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] IDENT_PAT NAME - IDENT "b" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "b" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CAST_EXPR PAREN_EXPR L_PAREN "(" @@ -148,17 +117,14 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "a" - R_PAREN ")" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + AS_KW "as" [] [WHITESPACE(" ")] REF_TYPE AMP "&" PAREN_TYPE L_PAREN "(" DYN_TRAIT_TYPE - DYN_KW "dyn" - WHITESPACE " " + DYN_KW "dyn" [] [WHITESPACE(" ")] TYPE_BOUND_LIST TYPE_BOUND PATH_TYPE @@ -174,23 +140,18 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "Other" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] ASSOC_TYPE_ARG NAME_REF - IDENT "Output" - WHITESPACE " " - EQ "=" - WHITESPACE " " + IDENT "Output" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Addable" - R_ANGLE ">" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + R_ANGLE ">" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] TYPE_BOUND PATH_TYPE PATH @@ -198,7 +159,6 @@ SOURCE_FILE NAME_REF IDENT "Other" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0070_expr_attr_placement.rast b/crates/parser/test_data/parser/ok/0070_expr_attr_placement.rast index 5229b97eb2af..ad2545da535a 100644 --- a/crates/parser/test_data/parser/ok/0070_expr_attr_placement.rast +++ b/crates/parser/test_data/parser/ok/0070_expr_attr_placement.rast @@ -1,19 +1,16 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "f" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] PAREN_EXPR - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] BIN_EXPR TRY_EXPR ATTR @@ -24,17 +21,14 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "a" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "lhs" - QUESTION "?" - WHITESPACE " " - PLUS "+" - WHITESPACE " " + QUESTION "?" [] [WHITESPACE(" ")] + PLUS "+" [] [WHITESPACE(" ")] AWAIT_EXPR ATTR POUND "#" @@ -44,8 +38,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "b" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT @@ -53,7 +46,6 @@ SOURCE_FILE IDENT "rhs" DOT "." AWAIT_KW "await" - R_PAREN ")" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0071_stmt_attr_placement.rast b/crates/parser/test_data/parser/ok/0071_stmt_attr_placement.rast index c0685448f256..53da913f5069 100644 --- a/crates/parser/test_data/parser/ok/0071_stmt_attr_placement.rast +++ b/crates/parser/test_data/parser/ok/0071_stmt_attr_placement.rast @@ -1,32 +1,27 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] EXPR_STMT BLOCK_EXPR ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] L_BRACK "[" PATH_META PATH PATH_SEGMENT NAME_REF IDENT "A" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] STMT_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] TRY_EXPR ATTR POUND "#" @@ -36,8 +31,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "B" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] MACRO_EXPR MACRO_CALL PATH @@ -48,25 +42,21 @@ SOURCE_FILE TOKEN_TREE L_PAREN "(" R_PAREN ")" - QUESTION "?" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n " + QUESTION "?" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] REF_EXPR ATTR - POUND "#" + POUND "#" [WHITESPACE(" ")] [] L_BRACK "[" PATH_META PATH PATH_SEGMENT NAME_REF IDENT "C" - R_BRACK "]" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] AMP "&" TUPLE_EXPR L_PAREN "(" - R_PAREN ")" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + R_PAREN ")" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0072_destructuring_assignment.rast b/crates/parser/test_data/parser/ok/0072_destructuring_assignment.rast index ce75c55189a0..7e019519e2ea 100644 --- a/crates/parser/test_data/parser/ok/0072_destructuring_assignment.rast +++ b/crates/parser/test_data/parser/ok/0072_destructuring_assignment.rast @@ -1,73 +1,58 @@ SOURCE_FILE FN - FN_KW "fn" - WHITESPACE " " + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "foo" PARAM_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] BLOCK_EXPR STMT_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_PAT L_PAREN "(" IDENT_PAT - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] NAME IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] NAME IDENT "b" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" LITERAL INT_NUMBER "0" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LITERAL INT_NUMBER "1" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR TUPLE_EXPR - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "b" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] RANGE_EXPR DOT2 ".." - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" PATH_EXPR @@ -75,78 +60,60 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "b" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PAREN_EXPR - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] UNDERSCORE_EXPR UNDERSCORE "_" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] RANGE_EXPR DOT2 ".." - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] STRUCT - STRUCT_KW "struct" - WHITESPACE " " + STRUCT_KW "struct" [WHITESPACE(" ")] [WHITESPACE(" ")] NAME - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] RECORD_FIELD NAME IDENT "a" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF - IDENT "i32" - WHITESPACE " " - R_CURLY "}" - WHITESPACE "\n " + IDENT "i32" [] [WHITESPACE(" ")] + R_CURLY "}" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [WHITESPACE(" ")] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " - DOT2 ".." - WHITESPACE " " - R_CURLY "}" - WHITESPACE " " - EQ "=" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] + DOT2 ".." [] [WHITESPACE(" ")] + R_CURLY "}" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] RECORD_EXPR PATH PATH_SEGMENT NAME_REF - IDENT "S" - WHITESPACE " " + IDENT "S" [] [WHITESPACE(" ")] RECORD_EXPR_FIELD_LIST - L_CURLY "{" - WHITESPACE " " + L_CURLY "{" [] [WHITESPACE(" ")] DOT2 ".." CALL_EXPR PATH_EXPR @@ -161,11 +128,9 @@ SOURCE_FILE IDENT "default" ARG_LIST L_PAREN "(" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] R_CURLY "}" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR CALL_EXPR @@ -173,15 +138,13 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "Some" + IDENT "Some" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" RANGE_EXPR DOT2 ".." - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] CALL_EXPR PATH_EXPR PATH @@ -193,8 +156,7 @@ SOURCE_FILE LITERAL INT_NUMBER "0" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR CALL_EXPR @@ -202,88 +164,72 @@ SOURCE_FILE PATH PATH_SEGMENT NAME_REF - IDENT "Ok" + IDENT "Ok" [WHITESPACE(" ")] [] ARG_LIST L_PAREN "(" UNDERSCORE_EXPR UNDERSCORE "_" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] LITERAL INT_NUMBER "0" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] LET_STMT - LET_KW "let" - WHITESPACE " " + LET_KW "let" [WHITESPACE(" ")] [WHITESPACE(" ")] TUPLE_PAT L_PAREN "(" IDENT_PAT NAME IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] IDENT_PAT NAME IDENT "b" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR ARRAY_EXPR - L_BRACK "[" + L_BRACK "[" [WHITESPACE(" ")] [] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] RANGE_EXPR DOT2 ".." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "b" - R_BRACK "]" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_BRACK "]" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] ARRAY_EXPR L_BRACK "[" LITERAL INT_NUMBER "1" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] RANGE_EXPR DOT2 ".." - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] LITERAL INT_NUMBER "2" R_BRACK "]" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR TUPLE_EXPR - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] UNDERSCORE_EXPR UNDERSCORE "_" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] UNDERSCORE_EXPR UNDERSCORE "_" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" PATH_EXPR @@ -291,26 +237,22 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "b" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR PAREN_EXPR - L_PAREN "(" + L_PAREN "(" [WHITESPACE(" ")] [] UNDERSCORE_EXPR UNDERSCORE "_" - R_PAREN ")" - WHITESPACE " " - EQ "=" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" PATH_EXPR @@ -318,23 +260,19 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "b" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n " + SEMICOLON ";" [] [NEWLINE("\n")] EXPR_STMT BIN_EXPR UNDERSCORE_EXPR - UNDERSCORE "_" - WHITESPACE " " - EQ "=" - WHITESPACE " " + UNDERSCORE "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + EQ "=" [] [WHITESPACE(" ")] TUPLE_EXPR L_PAREN "(" PATH_EXPR @@ -342,15 +280,13 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "a" - COMMA "," - WHITESPACE " " + COMMA "," [] [WHITESPACE(" ")] PATH_EXPR PATH PATH_SEGMENT NAME_REF IDENT "b" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/parser/test_data/parser/ok/0073_safe_declarations_in_extern_blocks.rast b/crates/parser/test_data/parser/ok/0073_safe_declarations_in_extern_blocks.rast index b3d9e5580675..23dde2b01230 100644 --- a/crates/parser/test_data/parser/ok/0073_safe_declarations_in_extern_blocks.rast +++ b/crates/parser/test_data/parser/ok/0073_safe_declarations_in_extern_blocks.rast @@ -1,23 +1,15 @@ SOURCE_FILE EXTERN_BLOCK - UNSAFE_KW "unsafe" - WHITESPACE " " + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] ABI - EXTERN_KW "extern" - WHITESPACE " " + EXTERN_KW "extern" [] [WHITESPACE(" ")] EXTERN_ITEM_LIST - L_CURLY "{" - WHITESPACE "\n " + L_CURLY "{" [] [NEWLINE("\n")] FN - COMMENT "// sqrt (from libm) may be called with any `f64`" - WHITESPACE "\n " VISIBILITY - PUB_KW "pub" - WHITESPACE " " - SAFE_KW "safe" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [WHITESPACE(" "), COMMENT("// sqrt (from libm) may be called with any `f64`"), NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] + SAFE_KW "safe" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "sqrt" PARAM_LIST @@ -26,37 +18,26 @@ SOURCE_FILE IDENT_PAT NAME IDENT "x" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "f64" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "f64" - SEMICOLON ";" - WHITESPACE "\n\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN - COMMENT "// strlen (from libc) requires a valid pointer," - WHITESPACE "\n " - COMMENT "// so we mark it as being an unsafe fn" - WHITESPACE "\n " VISIBILITY - PUB_KW "pub" - WHITESPACE " " - UNSAFE_KW "unsafe" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [NEWLINE("\n"), WHITESPACE(" "), COMMENT("// strlen (from libc) requires a valid pointer,"), NEWLINE("\n"), WHITESPACE(" "), COMMENT("// so we mark it as being an unsafe fn"), NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "strlen" PARAM_LIST @@ -65,37 +46,28 @@ SOURCE_FILE IDENT_PAT NAME IDENT "p" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - CONST_KW "const" - WHITESPACE " " + CONST_KW "const" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "c_char" - R_PAREN ")" - WHITESPACE " " + R_PAREN ")" [] [WHITESPACE(" ")] RET_TYPE - THIN_ARROW "->" - WHITESPACE " " + THIN_ARROW "->" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "usize" - SEMICOLON ";" - WHITESPACE "\n\n " + SEMICOLON ";" [] [NEWLINE("\n")] FN - COMMENT "// this function doesn't say safe or unsafe, so it defaults to unsafe" - WHITESPACE "\n " VISIBILITY - PUB_KW "pub" - WHITESPACE " " - FN_KW "fn" - WHITESPACE " " + PUB_KW "pub" [NEWLINE("\n"), WHITESPACE(" "), COMMENT("// this function doesn't say safe or unsafe, so it defaults to unsafe"), NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] + FN_KW "fn" [] [WHITESPACE(" ")] NAME IDENT "free" PARAM_LIST @@ -104,12 +76,10 @@ SOURCE_FILE IDENT_PAT NAME IDENT "p" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PTR_TYPE STAR "*" - MUT_KW "mut" - WHITESPACE " " + MUT_KW "mut" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH @@ -126,41 +96,30 @@ SOURCE_FILE NAME_REF IDENT "c_void" R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n " + SEMICOLON ";" [] [NEWLINE("\n")] STATIC VISIBILITY - PUB_KW "pub" - WHITESPACE " " - SAFE_KW "safe" - WHITESPACE " " - STATIC_KW "static" - WHITESPACE " " - MUT_KW "mut" - WHITESPACE " " + PUB_KW "pub" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] + SAFE_KW "safe" [] [WHITESPACE(" ")] + STATIC_KW "static" [] [WHITESPACE(" ")] + MUT_KW "mut" [] [WHITESPACE(" ")] NAME IDENT "COUNTER" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "i32" - SEMICOLON ";" - WHITESPACE "\n\n " + SEMICOLON ";" [] [NEWLINE("\n")] STATIC VISIBILITY - PUB_KW "pub" - WHITESPACE " " - UNSAFE_KW "unsafe" - WHITESPACE " " - STATIC_KW "static" - WHITESPACE " " + PUB_KW "pub" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] + UNSAFE_KW "unsafe" [] [WHITESPACE(" ")] + STATIC_KW "static" [] [WHITESPACE(" ")] NAME IDENT "IMPORTANT_BYTES" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] ARRAY_TYPE L_BRACK "[" PATH_TYPE @@ -168,26 +127,20 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "u8" - SEMICOLON ";" - WHITESPACE " " + SEMICOLON ";" [] [WHITESPACE(" ")] CONST_ARG LITERAL INT_NUMBER "256" R_BRACK "]" - SEMICOLON ";" - WHITESPACE "\n\n " + SEMICOLON ";" [] [NEWLINE("\n")] STATIC VISIBILITY - PUB_KW "pub" - WHITESPACE " " - SAFE_KW "safe" - WHITESPACE " " - STATIC_KW "static" - WHITESPACE " " + PUB_KW "pub" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] + SAFE_KW "safe" [] [WHITESPACE(" ")] + STATIC_KW "static" [] [WHITESPACE(" ")] NAME IDENT "LINES" - COLON ":" - WHITESPACE " " + COLON ":" [] [WHITESPACE(" ")] PATH_TYPE PATH PATH_SEGMENT @@ -202,7 +155,6 @@ SOURCE_FILE NAME_REF IDENT "i32" R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" - R_CURLY "}" - WHITESPACE "\n" + SEMICOLON ";" [] [NEWLINE("\n")] + R_CURLY "}" [] [NEWLINE("\n")] + EOF "" diff --git a/crates/rust-analyzer/src/cli/unresolved_references.rs b/crates/rust-analyzer/src/cli/unresolved_references.rs index d9a56098bd9d..b9b62a27e1e4 100644 --- a/crates/rust-analyzer/src/cli/unresolved_references.rs +++ b/crates/rust-analyzer/src/cli/unresolved_references.rs @@ -152,7 +152,7 @@ fn all_unresolved_references( let Some(name_ref) = ast::NameRef::cast(syntax) else { continue; }; - let Some(descended_name_ref) = name_ref.syntax().first_token().and_then(|tok| { + let Some(descended_name_ref) = name_ref.syntax().first_non_trivia_token().and_then(|tok| { sema.descend_into_macros_single_exact(tok).parent().and_then(ast::NameRef::cast) }) else { continue; diff --git a/crates/syntax-bridge/src/lib.rs b/crates/syntax-bridge/src/lib.rs index 3e6e5f804e26..a7da74aecf67 100644 --- a/crates/syntax-bridge/src/lib.rs +++ b/crates/syntax-bridge/src/lib.rs @@ -289,7 +289,11 @@ where } let spacing = match conv.peek().map(|next| next.kind(conv)) { - Some(kind) if is_single_token_op(kind) => tt::Spacing::Joint, + Some(kind) + if is_single_token_op(kind) && conv.next_starts_at(abs_range.end()) => + { + tt::Spacing::Joint + } _ => tt::Spacing::Alone, }; let Some(char) = token.to_char(conv) else { @@ -498,6 +502,8 @@ trait TokenConverter: Sized { fn peek(&self) -> Option; + fn next_starts_at(&self, end: TextSize) -> bool; + fn span_for(&self, range: TextRange) -> Span; fn call_site(&self) -> Span; @@ -564,6 +570,10 @@ impl TokenConverter for RawConverter<'_> { Some(self.pos) } + fn next_starts_at(&self, _end: TextSize) -> bool { + true + } + fn span_for(&self, range: TextRange) -> Span { Span { range, anchor: self.anchor, ctx: self.ctx } } @@ -606,6 +616,10 @@ impl TokenConverter for StaticRawConverter<'_> { Some(self.pos) } + fn next_starts_at(&self, _end: TextSize) -> bool { + true + } + fn span_for(&self, _: TextRange) -> Span { self.span } @@ -826,6 +840,15 @@ where Some(token) } + fn next_starts_at(&self, end: TextSize) -> bool { + if let Some((punct, offset)) = &self.punct_offset + && usize::from(*offset) + 1 < punct.text().len() + { + return true; + } + self.current.as_ref().is_some_and(|it| it.text_range().start() == end) + } + fn span_for(&self, range: TextRange) -> Span { self.map.span_for(range) } @@ -1009,21 +1032,30 @@ impl TtTreeSink<'_> { } self.token_map.push(self.text_pos, combined_span.expect("expected at least one token")); - self.inner.token(kind, self.buf.as_str()); - self.buf.clear(); - // FIXME: Emitting whitespace for this is really just a hack, we should get rid of it. - // Add whitespace between adjoint puncts - if let Some([tt::Leaf::Punct(curr), tt::Leaf::Punct(next)]) = last_two { - // Note: We always assume the semi-colon would be the last token in - // other parts of RA such that we don't add whitespace here. - // - // When `next` is a `Punct` of `'`, that's a part of a lifetime identifier so we don't - // need to add whitespace either. - if curr.spacing == tt::Spacing::Alone && curr.char != ';' && next.char != '\'' { - self.inner.token(WHITESPACE, " "); - self.text_pos += TextSize::of(' '); - self.token_map.push(self.text_pos, curr.span); + // Note: We always assume the semi-colon would be the last token in + // other parts of RA such that we don't add whitespace here. + // + // When `next` is a `Punct` of `'`, that's a part of a lifetime identifier so we don't + // need to add whitespace either. + let separator = match last_two { + Some([tt::Leaf::Punct(curr), tt::Leaf::Punct(next)]) + if curr.spacing == tt::Spacing::Alone && curr.char != ';' && next.char != '\'' => + { + Some(curr.span) } + _ => None, + }; + let trailing = [parser::Trivia { kind: WHITESPACE, text: " " }]; + self.inner.token_with_trivia( + kind, + self.buf.as_str(), + &[], + if separator.is_some() { &trailing } else { &[] }, + ); + self.buf.clear(); + if let Some(span) = separator { + self.text_pos += TextSize::of(' '); + self.token_map.push(self.text_pos, span); } } diff --git a/crates/syntax-bridge/src/prettify_macro_expansion.rs b/crates/syntax-bridge/src/prettify_macro_expansion.rs index c5e4aca95ee1..188b4d5bd904 100644 --- a/crates/syntax-bridge/src/prettify_macro_expansion.rs +++ b/crates/syntax-bridge/src/prettify_macro_expansion.rs @@ -1,9 +1,10 @@ //! Utilities for formatting macro expanded nodes until we get a proper formatter. +use rustc_hash::FxHashMap; use syntax::{ NodeOrToken, SyntaxKind::{self, *}, SyntaxNode, SyntaxToken, T, WalkEvent, - ast::syntax_factory::SyntaxFactory, + ast::{make, syntax_factory::SyntaxFactory}, syntax_editor::{Position, SyntaxEditor}, }; @@ -31,16 +32,14 @@ pub fn prettify_macro_expansion( let mut dollar_crate_replacements = Vec::new(); let (editor, syn) = SyntaxEditor::new(syn); - let before = Position::before; - let after = Position::after; + let before = false; + let after = true; - let do_indent = |pos: fn(_) -> Position, token: &SyntaxToken, indent| { - (pos(token.clone()), PrettifyWsKind::Indent(indent)) + let do_indent = |side: bool, token: &SyntaxToken, indent| { + (token.clone(), side, PrettifyWsKind::Indent(indent)) }; - let do_ws = - |pos: fn(_) -> Position, token: &SyntaxToken| (pos(token.clone()), PrettifyWsKind::Space); - let do_nl = - |pos: fn(_) -> Position, token: &SyntaxToken| (pos(token.clone()), PrettifyWsKind::Newline); + let do_ws = |side: bool, token: &SyntaxToken| (token.clone(), side, PrettifyWsKind::Space); + let do_nl = |side: bool, token: &SyntaxToken| (token.clone(), side, PrettifyWsKind::Newline); for event in syn.preorder_with_tokens() { let token = match event { @@ -52,14 +51,19 @@ pub fn prettify_macro_expansion( let is_non_last_newline = match node.kind() { MATCH_ARM | STRUCT | ENUM | UNION | FN | IMPL | MACRO_RULES | EXTERN_BLOCK | EXTERN_CRATE | MODULE => true, - EXPR_STMT if Some(R_CURLY) == node.last_token().map(|it| it.kind()) => true, + EXPR_STMT + if Some(R_CURLY) == node.last_non_trivia_token().map(|it| it.kind()) => + { + true + } _ => false, }; if (!is_last_child && is_non_last_newline) || is_always_newline { - mods.push((Position::after(node.clone()), PrettifyWsKind::Indent(indent))); + let Some(last) = node.last_non_trivia_token() else { continue }; if node.parent().is_some() { - mods.push((Position::after(node), PrettifyWsKind::Newline)); + mods.push(do_nl(after, &last)); } + mods.push(do_indent(after, &last, indent)); } continue; } @@ -74,8 +78,12 @@ pub fn prettify_macro_expansion( let tok = &token; let is_next = |f: fn(SyntaxKind) -> bool, default| -> bool { - tok.next_token().map(|it| f(it.kind())).unwrap_or(default) + tok.next_non_trivia_token() + .filter(|it| it.kind() != SyntaxKind::EOF) + .map(|it| f(it.kind())) + .unwrap_or(default) }; + let spaced = tok.trailing_trivia().next().is_some(); let is_last = |f: fn(SyntaxKind) -> bool, default| -> bool { last.map(f).unwrap_or(default) }; @@ -87,18 +95,18 @@ pub fn prettify_macro_expansion( } L_CURLY if is_next(|it| it != R_CURLY, true) => { indent += 1; - mods.push(do_indent(after, tok, indent)); mods.push(do_nl(after, tok)); + mods.push(do_indent(after, tok, indent)); } R_CURLY if is_last(|it| it != L_CURLY, true) => { indent = indent.saturating_sub(1); - mods.push(do_indent(before, tok, indent)); mods.push(do_nl(before, tok)); + mods.push(do_indent(before, tok, indent)); } R_CURLY if is_next(|it| it == T![else], false) => { - mods.push(do_indent(before, tok, indent)); mods.push(do_nl(before, tok)); + mods.push(do_indent(before, tok, indent)); } LIFETIME_IDENT if is_next(is_text, true) => { mods.push(do_ws(after, tok)); @@ -107,12 +115,12 @@ pub fn prettify_macro_expansion( mods.push(do_ws(after, tok)); } T![;] if is_next(|it| it != R_CURLY, true) => { - mods.push(do_indent(after, tok, indent)); if tok.text_range().end() != syn.text_range().end() { mods.push(do_nl(after, tok)); } + mods.push(do_indent(after, tok, indent)); } - T![=] if let Some((last, next)) = last.zip(tok.next_token()) => { + T![=] if let Some((last, next)) = last.zip(tok.next_non_trivia_token()) => { // FIXME: this branch is for `=>` in macro_rules!, which is currently parsed as // two separate symbols. match (last, next.kind()) { @@ -138,20 +146,18 @@ pub fn prettify_macro_expansion( mods.push(do_ws(before, tok)); mods.push(do_ws(after, tok)); } - T![:] if is_next(|it| it != T![:], false) && is_last(|it| it != T![:], false) => { - // XXX: Why input included WHITESPACE? - if is_next(|it| it != SyntaxKind::WHITESPACE, false) { - mods.push(do_ws(after, tok)); - } + T![:] + if !spaced + && is_next(|it| it != T![:], false) + && is_last(|it| it != T![:], false) => + { + mods.push(do_ws(after, tok)); } T![!] if is_last(|it| it == MACRO_RULES_KW, false) && is_next(is_text, false) => { mods.push(do_ws(after, tok)); } - T![,] if tok.parent().is_some_and(|it| it.kind() != MATCH_ARM) => { - if is_next( - |it| !matches!(it, R_BRACK | R_PAREN | R_CURLY | T![,] | WHITESPACE), - false, - ) { + T![,] if !spaced && tok.parent().is_some_and(|it| it.kind() != MATCH_ARM) => { + if is_next(|it| !matches!(it, R_BRACK | R_PAREN | R_CURLY | T![,]), false) { mods.push(do_ws(after, tok)); } } @@ -161,24 +167,59 @@ pub fn prettify_macro_expansion( last = Some(tok.kind()); } - inspect_mods(&mods); - for (pos, insert) in mods { - editor.insert( - pos, - match insert { - PrettifyWsKind::Space => editor.make().whitespace(" "), - PrettifyWsKind::Indent(0) => continue, - PrettifyWsKind::Indent(indent) => editor.make().whitespace(&" ".repeat(4 * indent)), - PrettifyWsKind::Newline => editor.make().whitespace("\n"), - }, - ); + let positions: Vec<_> = mods + .iter() + .map(|(token, side, kind)| { + let position = match side { + true => Position::after(token.clone()), + false => Position::before(token.clone()), + }; + (position, *kind) + }) + .collect(); + inspect_mods(&positions); + + let mut leading: FxHashMap = FxHashMap::default(); + let mut trailing: FxHashMap = FxHashMap::default(); + for (token, side, insert) in mods { + let text = match insert { + PrettifyWsKind::Space => " ".to_owned(), + PrettifyWsKind::Indent(0) => continue, + PrettifyWsKind::Indent(indent) => " ".repeat(4 * indent), + PrettifyWsKind::Newline => "\n".to_owned(), + }; + match side { + true => trailing.entry(token).or_default().push_str(&text), + false => leading.entry(token).or_default().push_str(&text), + } + } + for (token, text) in &mut trailing { + if let Some(index) = text.find('\n') { + let rest = text.split_off(index + 1); + if !rest.is_empty() + && let Some(next) = token.next_non_trivia_token() + { + leading.entry(next).or_default().insert_str(0, &rest); + } + } + } + for (token, text) in leading { + if !text.is_empty() { + editor.splice_leading_trivia(&token, ..0, make::tokens::trivia(&text)); + } + } + for (token, text) in trailing { + if !text.is_empty() { + let end = token.trailing_trivia().len(); + editor.splice_trailing_trivia(&token, end.., make::tokens::trivia(&text)); + } } for (old, new) in dollar_crate_replacements { editor.replace(old, new); } - if let Some(it) = syn.last_token().filter(|it| it.kind() == SyntaxKind::WHITESPACE) { - editor.delete(it); + if let Some(it) = syn.descendants_with_tokens().filter_map(|it| it.into_token()).last() { + editor.splice_trailing_trivia(&it, .., []); } editor.finish().new_root().clone() @@ -209,12 +250,10 @@ mod tests { fn remove_whitespaces(node: &SyntaxNode) -> SyntaxNode { let (editor, node) = SyntaxEditor::new(node.clone()); - node.preorder_with_tokens().for_each(|it| match it { - WalkEvent::Enter(NodeOrToken::Token(tok)) if tok.kind().is_trivia() => { - editor.delete(tok); - } - _ => (), - }); + for token in node.descendants_with_tokens().filter_map(|it| it.into_token()) { + editor.splice_leading_trivia(&token, .., []); + editor.splice_trailing_trivia(&token, .., []); + } editor.finish().new_root().clone() } } diff --git a/crates/syntax/src/algo.rs b/crates/syntax/src/algo.rs index c679921b3f65..9cd11cba55e8 100644 --- a/crates/syntax/src/algo.rs +++ b/crates/syntax/src/algo.rs @@ -1,10 +1,14 @@ //! Collection of assorted algorithms for syntax trees. +use std::{iter::successors, ops::Range}; + use itertools::Itertools; use crate::{ AstNode, Direction, NodeOrToken, SyntaxElement, SyntaxKind, SyntaxNode, SyntaxToken, TextRange, - TextSize, syntax_editor::Element, + TextSize, + ast::{self, AstToken}, + syntax_editor::{Element, SyntaxEditor, TriviaSide}, }; /// Returns ancestors of the node at the offset, sorted by length. This should @@ -17,7 +21,8 @@ pub fn ancestors_at_offset( offset: TextSize, ) -> impl Iterator { node.token_at_offset(offset) - .map(|token| token.parent_ancestors()) + .filter_map(|token| token.owning_node()) + .map(|node| node.ancestors()) .kmerge_by(|node1, node2| node1.text_range().len() < node2.text_range().len()) } @@ -38,40 +43,88 @@ pub fn find_node_at_range(syntax: &SyntaxNode, range: TextRange) -> syntax.covering_element(range).ancestors().find_map(N::cast) } -/// Skip to next non `trivia` token -pub fn skip_trivia_token(mut token: SyntaxToken, direction: Direction) -> Option { - while token.kind().is_trivia() { - token = match direction { - Direction::Next => token.next_token()?, - Direction::Prev => token.prev_token()?, +pub fn starts_line(element: &SyntaxElement) -> bool { + element + .trivia_before() + .rev() + .find(|it| it.kind() != SyntaxKind::WHITESPACE) + .is_some_and(|it| it.kind() == SyntaxKind::NEWLINE) +} + +pub(crate) fn outer_blank_trivia(token: &SyntaxToken, side: TriviaSide) -> Range { + let blank = |trivia_token: &SyntaxToken| { + matches!(trivia_token.kind(), SyntaxKind::WHITESPACE | SyntaxKind::NEWLINE) + }; + match side { + TriviaSide::Leading => 0..token.leading_trivia().take_while(blank).count(), + TriviaSide::Trailing => { + let trailing = token.trailing_trivia(); + let len = trailing.len(); + len - trailing.rev().take_while(blank).count()..len } } - Some(token) } -/// Skip to next non `whitespace` token -pub fn skip_whitespace_token(mut token: SyntaxToken, direction: Direction) -> Option { - while token.kind() == SyntaxKind::WHITESPACE { - token = match direction { - Direction::Next => token.next_token()?, - Direction::Prev => token.prev_token()?, - } + +pub(crate) fn strip_outer_blank_trivia(node: &SyntaxNode) -> SyntaxNode { + let (editor, node) = SyntaxEditor::new(node.clone()); + if let Some(first) = node.first_non_trivia_token() { + editor.splice_leading_trivia(&first, outer_blank_trivia(&first, TriviaSide::Leading), []); } - Some(token) + if let Some(last) = node.last_non_trivia_token() { + editor.splice_trailing_trivia(&last, outer_blank_trivia(&last, TriviaSide::Trailing), []); + } + editor.finish().new_root().clone() +} + +pub struct BlankRun { + pub range: TextRange, + pub before: Option, + pub after: Option, + pub newlines: usize, +} + +pub fn blank_run(token: &SyntaxToken) -> BlankRun { + let blank = + |it: &SyntaxToken| matches!(it.kind(), SyntaxKind::WHITESPACE | SyntaxKind::NEWLINE); + let mut first = token.clone(); + while let Some(it) = first.prev_token().filter(blank) { + first = it; + } + let mut last = token.clone(); + while let Some(it) = last.next_token().filter(blank) { + last = it; + } + let range = TextRange::new(first.text_range().start(), last.text_range().end()); + let newlines = successors(Some(first.clone()), |it| it.next_token()) + .take_while(|it| it.text_range().end() <= range.end()) + .filter(|it| it.kind() == SyntaxKind::NEWLINE) + .count(); + BlankRun { range, before: first.prev_token(), after: last.next_token(), newlines } } -/// Finds the first sibling in the given direction which is not `trivia` -pub fn non_trivia_sibling(element: SyntaxElement, direction: Direction) -> Option { - return match element { - NodeOrToken::Node(node) => node.siblings_with_tokens(direction).skip(1).find(not_trivia), - NodeOrToken::Token(token) => token.siblings_with_tokens(direction).skip(1).find(not_trivia), +pub fn adjacent_comment(token: &SyntaxToken, direction: Direction) -> Option { + let step = |it: &SyntaxToken| match direction { + Direction::Next => it.next_token(), + Direction::Prev => it.prev_token(), }; + let mut newlines = 0; + successors(step(token), step) + .take_while(|it| { + newlines += usize::from(it.kind() == SyntaxKind::NEWLINE); + newlines <= 1 + }) + .find(|it| !matches!(it.kind(), SyntaxKind::WHITESPACE | SyntaxKind::NEWLINE)) + .filter(|it| ast::AnyComment::can_cast(it.kind())) +} - fn not_trivia(element: &SyntaxElement) -> bool { - match element { - NodeOrToken::Node(_) => true, - NodeOrToken::Token(token) => !token.kind().is_trivia(), +pub fn skip_whitespace_token(mut token: SyntaxToken, direction: Direction) -> Option { + while matches!(token.kind(), SyntaxKind::WHITESPACE | SyntaxKind::NEWLINE) { + token = match direction { + Direction::Next => token.next_token()?, + Direction::Prev => token.prev_token()?, } } + Some(token) } pub fn least_common_ancestor(u: &SyntaxNode, v: &SyntaxNode) -> Option { @@ -116,35 +169,3 @@ pub fn neighbor(me: &T, direction: Direction) -> Option { pub fn has_errors(node: &SyntaxNode) -> bool { node.children().any(|it| it.kind() == SyntaxKind::ERROR) } - -pub fn previous_non_trivia_token(e: impl Into) -> Option { - let mut token = match e.into() { - SyntaxElement::Node(n) => n.first_token()?, - SyntaxElement::Token(t) => t, - } - .prev_token(); - while let Some(inner) = token { - if !inner.kind().is_trivia() { - return Some(inner); - } else { - token = inner.prev_token(); - } - } - None -} - -pub fn next_non_trivia_token(e: impl Into) -> Option { - let mut token = match e.into() { - SyntaxElement::Node(n) => n.last_token()?, - SyntaxElement::Token(t) => t, - } - .next_token(); - while let Some(inner) = token { - if !inner.kind().is_trivia() { - return Some(inner); - } else { - token = inner.next_token(); - } - } - None -} diff --git a/crates/syntax/src/ast.rs b/crates/syntax/src/ast.rs index 2f1fad2dc7e3..7f104f5bc0c1 100644 --- a/crates/syntax/src/ast.rs +++ b/crates/syntax/src/ast.rs @@ -369,7 +369,7 @@ fn test_four_slash_line_comment() { #[test] fn test_where_predicates() { fn assert_bound(text: &str, bound: Option) { - assert_eq!(text, bound.unwrap().syntax().text().to_string()); + assert_eq!(text, bound.unwrap().syntax().text_without_outer_trivia().to_string()); } let file = SourceFile::parse( @@ -396,7 +396,7 @@ where let mut bounds = pred.type_bound_list().unwrap().bounds(); assert!(pred.for_binder().is_none()); - assert_eq!("T", pred.ty().unwrap().syntax().text().to_string()); + assert_eq!("T", pred.ty().unwrap().syntax().text_without_outer_trivia().to_string()); assert_bound("Clone", bounds.next()); assert_bound("Copy", bounds.next()); assert_bound("Debug", bounds.next()); @@ -413,20 +413,29 @@ where let pred = predicates.next().unwrap(); let mut bounds = pred.type_bound_list().unwrap().bounds(); - assert_eq!("Iterator::Item", pred.ty().unwrap().syntax().text().to_string()); + assert_eq!( + "Iterator::Item", + pred.ty().unwrap().syntax().text_without_outer_trivia().to_string() + ); assert_bound("'a", bounds.next()); let pred = predicates.next().unwrap(); let mut bounds = pred.type_bound_list().unwrap().bounds(); - assert_eq!("Iterator::Item", pred.ty().unwrap().syntax().text().to_string()); + assert_eq!( + "Iterator::Item", + pred.ty().unwrap().syntax().text_without_outer_trivia().to_string() + ); assert_bound("Debug", bounds.next()); assert_bound("'a", bounds.next()); let pred = predicates.next().unwrap(); let mut bounds = pred.type_bound_list().unwrap().bounds(); - assert_eq!("::Item", pred.ty().unwrap().syntax().text().to_string()); + assert_eq!( + "::Item", + pred.ty().unwrap().syntax().text_without_outer_trivia().to_string() + ); assert_bound("Debug", bounds.next()); assert_bound("'a", bounds.next()); @@ -435,8 +444,14 @@ where assert_eq!( "<'a>", - pred.for_binder().unwrap().generic_param_list().unwrap().syntax().text().to_string() + pred.for_binder() + .unwrap() + .generic_param_list() + .unwrap() + .syntax() + .text_without_outer_trivia() + .to_string() ); - assert_eq!("F", pred.ty().unwrap().syntax().text().to_string()); + assert_eq!("F", pred.ty().unwrap().syntax().text_without_outer_trivia().to_string()); assert_bound("Fn(&'a str)", bounds.next()); } diff --git a/crates/syntax/src/ast/edit.rs b/crates/syntax/src/ast/edit.rs index e34cfa746073..eb741b5e5e7f 100644 --- a/crates/syntax/src/ast/edit.rs +++ b/crates/syntax/src/ast/edit.rs @@ -2,16 +2,12 @@ //! immutable, all function here return a fresh copy of the tree, instead of //! doing an in-place modification. use parser::{SyntaxKind::DOC_COMMENT, T}; -use std::{ - fmt, - iter::{self, once}, - ops, -}; +use std::{fmt, iter::once, ops}; use crate::{ - AstToken, NodeOrToken, SyntaxElement, - SyntaxKind::{ATTR, COMMENT, WHITESPACE}, - SyntaxNode, SyntaxToken, + SyntaxElement, + SyntaxKind::ATTR, + SyntaxNode, SyntaxToken, algo, ast::{self, AstNode, HasName, make}, syntax_editor::{Position, Removable, SyntaxEditor, SyntaxMappingBuilder}, }; @@ -70,63 +66,70 @@ impl IndentLevel { } pub fn from_node(node: &SyntaxNode) -> IndentLevel { - match node.first_token() { + match node.first_non_trivia_token() { Some(it) => Self::from_token(&it), None => IndentLevel(0), } } pub fn from_token(token: &SyntaxToken) -> IndentLevel { - for ws in prev_tokens(token.clone()).filter_map(ast::Whitespace::cast) { - let text = ws.syntax().text(); - if let Some(pos) = text.rfind('\n') { - let level = text[pos + 1..].chars().count() / 4; - return IndentLevel(level as u8); - } + let mut line = String::new(); + let mut current = token.prev_token(); + while let Some(prev) = current.filter(|it| it.kind() != crate::SyntaxKind::NEWLINE) { + line.insert_str(0, prev.text()); + current = prev.prev_token(); } - IndentLevel(0) + IndentLevel((line.chars().take_while(|&ch| ch == ' ').count() / 4) as u8) } pub(super) fn clone_increase_indent(self, node: &SyntaxNode) -> SyntaxNode { - let (editor, node) = SyntaxEditor::new(node.clone()); - let tokens = node - .preorder_with_tokens() - .filter_map(|event| match event { - rowan::WalkEvent::Leave(NodeOrToken::Token(it)) => Some(it), - _ => None, - }) - .filter_map(ast::Whitespace::cast) - .filter(|ws| ws.text().contains('\n')); - for ws in tokens { - let new_ws = make::tokens::whitespace(&format!("{}{self}", ws.syntax())); - editor.replace(ws.syntax(), &new_ws); - } - editor.finish().new_root().clone() + self.clone_adjust_indent(node, true, false) } pub(super) fn clone_decrease_indent(self, node: &SyntaxNode) -> SyntaxNode { + self.clone_adjust_indent(node, false, false) + } + + fn clone_adjust_indent( + self, + node: &SyntaxNode, + increase: bool, + from_line_start: bool, + ) -> SyntaxNode { let (editor, node) = SyntaxEditor::new(node.clone()); - let tokens = node - .preorder_with_tokens() - .filter_map(|event| match event { - rowan::WalkEvent::Leave(NodeOrToken::Token(it)) => Some(it), - _ => None, - }) - .filter_map(ast::Whitespace::cast) - .filter(|ws| ws.text().contains('\n')); - for ws in tokens { - let new_ws = - make::tokens::whitespace(&ws.syntax().text().replace(&format!("\n{self}"), "\n")); - editor.replace(ws.syntax(), &new_ws); + let indent = self.to_string(); + let mut line_start = from_line_start; + for token in node.descendants_with_tokens().filter_map(|it| it.into_token()) { + let text: String = token.leading_trivia().map(|it| it.text().to_owned()).collect(); + let lines = text.split('\n').collect::>(); + let mut adjusted = String::new(); + for (index, line) in lines.iter().enumerate() { + let last = index + 1 == lines.len(); + let at_line_start = (index > 0 || line_start) && !(line.is_empty() && !last); + match (at_line_start, increase) { + (true, true) => { + adjusted.push_str(&indent); + adjusted.push_str(line); + } + (true, false) => adjusted.push_str(line.strip_prefix(&indent).unwrap_or(line)), + (false, _) => adjusted.push_str(line), + } + if !last { + adjusted.push('\n'); + } + } + if adjusted != text { + editor.splice_leading_trivia(&token, .., make::tokens::trivia(&adjusted)); + } + line_start = token + .trailing_trivia() + .next_back() + .is_some_and(|it| it.kind() == crate::SyntaxKind::NEWLINE); } editor.finish().new_root().clone() } } -fn prev_tokens(token: SyntaxToken) -> impl Iterator { - iter::successors(Some(token), |token| token.prev_token()) -} - pub trait AstNodeEdit: AstNode + Clone + Sized { fn indent_level(&self) -> IndentLevel { IndentLevel::from_node(self.syntax()) @@ -148,13 +151,24 @@ pub trait AstNodeEdit: AstNode + Clone + Sized { new_node } #[must_use] + fn detached(&self) -> Self { + let (editor, node) = SyntaxEditor::new(self.syntax().clone()); + if let Some(first) = node.first_non_trivia_token() { + editor.splice_leading_trivia(&first, .., []); + } + if let Some(last) = node.last_non_trivia_token() { + editor.splice_trailing_trivia(&last, .., []); + } + Self::cast(editor.finish().new_root().clone()).unwrap() + } + #[must_use] fn dedent(&self, level: IndentLevel) -> Self { Self::cast(level.clone_decrease_indent(self.syntax())).unwrap() } #[must_use] fn reset_indent(&self) -> Self { let level = IndentLevel::from_node(self.syntax()); - self.dedent(level) + Self::cast(level.clone_adjust_indent(self.syntax(), false, true)).unwrap() } } @@ -162,20 +176,10 @@ impl AstNodeEdit for N {} pub trait AttrsOwnerEdit: ast::HasAttrs { fn remove_attrs_and_docs(&self, editor: &SyntaxEditor) { - let mut remove_next_ws = false; for child in self.syntax().children_with_tokens() { - match child.kind() { - ATTR | COMMENT | DOC_COMMENT => { - remove_next_ws = true; - editor.delete(child); - continue; - } - WHITESPACE if remove_next_ws => { - editor.delete(child); - } - _ => (), + if matches!(child.kind(), ATTR | DOC_COMMENT) { + editor.delete(child); } - remove_next_ws = false; } } } @@ -196,11 +200,14 @@ impl ast::IdentPat { .unwrap_or_else(|| at_token.into()); editor.delete_all(start..=end); - // Remove any trailing ws - if let Some(last) = - self.syntax().last_token().filter(|it| it.kind() == WHITESPACE) + if let Some(name) = self.name() + && let Some(last) = name.syntax().last_non_trivia_token() { - editor.delete(last); + let blank = algo::outer_blank_trivia( + &last, + crate::syntax_editor::TriviaSide::Trailing, + ); + editor.splice_trailing_trivia(&last, blank, []); } } } @@ -215,10 +222,8 @@ impl ast::IdentPat { // Don't have an `@`, should have a name let name = self.name().unwrap(); let elements = vec![ - make.whitespace(" ").into(), - make.token(T![@]).into(), - make.whitespace(" ").into(), - pat.syntax().clone().into(), + make.with_leading_trivia(make.token(T![@]), " "), + make.with_leading_trivia(pat.syntax(), " "), ]; if self.syntax().parent().is_none() { @@ -339,7 +344,10 @@ impl ast::UseTree { ) }; let use_tree_list = make.use_tree_list(once(suffix)); - let new_use_tree = make.use_tree(prefix.clone(), Some(use_tree_list), None, false); + let prefix = + ast::Path::cast(make.with_trailing_trivia(prefix.syntax(), "").into_node().unwrap()) + .unwrap(); + let new_use_tree = make.use_tree(prefix, Some(use_tree_list), None, false); editor.replace(self.syntax(), new_use_tree.syntax()); } diff --git a/crates/syntax/src/ast/expr_ext.rs b/crates/syntax/src/ast/expr_ext.rs index 2b1c91f20517..86f987882262 100644 --- a/crates/syntax/src/ast/expr_ext.rs +++ b/crates/syntax/src/ast/expr_ext.rs @@ -115,27 +115,36 @@ fn if_block_condition() { parser::Edition::CURRENT, ); let if_ = parse.tree().syntax().descendants().find_map(ast::IfExpr::cast).unwrap(); - assert_eq!(if_.then_branch().unwrap().syntax().text(), r#"{ "if" }"#); + assert_eq!(if_.then_branch().unwrap().syntax().text_without_outer_trivia(), r#"{ "if" }"#); let elif = match if_.else_branch().unwrap() { ElseBranch::IfExpr(elif) => elif, ElseBranch::Block(_) => panic!("should be `else if`"), }; - assert_eq!(elif.then_branch().unwrap().syntax().text(), r#"{ "first elif" }"#); + assert_eq!( + elif.then_branch().unwrap().syntax().text_without_outer_trivia(), + r#"{ "first elif" }"# + ); let elif = match elif.else_branch().unwrap() { ElseBranch::IfExpr(elif) => elif, ElseBranch::Block(_) => panic!("should be `else if`"), }; - assert_eq!(elif.then_branch().unwrap().syntax().text(), r#"{ "second elif" }"#); + assert_eq!( + elif.then_branch().unwrap().syntax().text_without_outer_trivia(), + r#"{ "second elif" }"# + ); let elif = match elif.else_branch().unwrap() { ElseBranch::IfExpr(elif) => elif, ElseBranch::Block(_) => panic!("should be `else if`"), }; - assert_eq!(elif.then_branch().unwrap().syntax().text(), r#"{ "third elif" }"#); + assert_eq!( + elif.then_branch().unwrap().syntax().text_without_outer_trivia(), + r#"{ "third elif" }"# + ); let else_ = match elif.else_branch().unwrap() { ElseBranch::Block(else_) => else_, ElseBranch::IfExpr(_) => panic!("should be `else`"), }; - assert_eq!(else_.syntax().text(), r#"{ "else" }"#); + assert_eq!(else_.syntax().text_without_outer_trivia(), r#"{ "else" }"#); } #[test] @@ -150,12 +159,12 @@ fn if_condition_with_if_inside() { parser::Edition::CURRENT, ); let if_ = parse.tree().syntax().descendants().find_map(ast::IfExpr::cast).unwrap(); - assert_eq!(if_.then_branch().unwrap().syntax().text(), r#"{ "if" }"#); + assert_eq!(if_.then_branch().unwrap().syntax().text_without_outer_trivia(), r#"{ "if" }"#); let else_ = match if_.else_branch().unwrap() { ElseBranch::Block(else_) => else_, ElseBranch::IfExpr(_) => panic!("should be `else`"), }; - assert_eq!(else_.syntax().text(), r#"{ "else" }"#); + assert_eq!(else_.syntax().text_without_outer_trivia(), r#"{ "else" }"#); } impl ast::PrefixExpr { @@ -335,7 +344,7 @@ impl ast::Literal { pub fn token(&self) -> SyntaxToken { self.syntax() .children_with_tokens() - .find(|e| !ast::AnyAttr::can_cast(e.kind()) && !e.kind().is_trivia()) + .find(|e| !ast::AnyAttr::can_cast(e.kind())) .and_then(|e| e.into_token()) .unwrap() } diff --git a/crates/syntax/src/ast/generated/nodes.rs b/crates/syntax/src/ast/generated/nodes.rs index ad52d8278727..c345067560b9 100644 --- a/crates/syntax/src/ast/generated/nodes.rs +++ b/crates/syntax/src/ast/generated/nodes.rs @@ -9979,941 +9979,941 @@ impl From for AnyHasVisibility { } impl std::fmt::Display for Adt { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AnyAttr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AsmOperand { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AsmPiece { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AssocItem { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for CfgPredicate { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Expr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ExternItem { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for FieldList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for GenericArg { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for GenericParam { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Item { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Meta { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Pat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Stmt { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Type { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for UseBoundGenericArg { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for VariantDef { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Abi { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ArgList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ArrayExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ArrayType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AsmClobberAbi { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AsmConst { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AsmDirSpec { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AsmExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AsmLabel { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AsmOperandExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AsmOperandNamed { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AsmOption { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AsmOptions { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AsmRegOperand { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AsmRegSpec { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AsmSym { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AssocItemList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AssocTypeArg { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Attr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for AwaitExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for BecomeExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for BinExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for BlockExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for BoxPat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for BreakExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for CallExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for CastExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for CfgAtom { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for CfgAttrMeta { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for CfgComposite { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for CfgMeta { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ClosureExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Const { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ConstArg { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ConstBlockPat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ConstParam { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ContinueExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for DerefPat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for DocComment { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for DynTraitType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Enum { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ExprStmt { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ExternBlock { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ExternCrate { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ExternItemList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for FieldExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Fn { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for FnPtrType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ForBinder { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ForExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ForType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for FormatArgsArg { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for FormatArgsExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for GenericArgList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for GenericParamList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for IdentPat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for IfExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Impl { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ImplRestriction { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ImplTraitType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for IncludeBytesExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for IndexExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for InferType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ItemList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for KeyValueMeta { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Label { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for LetElse { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for LetExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for LetStmt { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Lifetime { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for LifetimeArg { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for LifetimeParam { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Literal { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for LiteralPat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for LoopExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for MacroCall { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for MacroDef { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for MacroExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for MacroItems { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for MacroPat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for MacroRules { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for MacroStmts { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for MacroType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for MatchArm { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for MatchArmList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for MatchExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for MatchGuard { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for MethodCallExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Module { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for MutRestriction { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Name { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for NameRef { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for NeverType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for NotNull { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for OffsetOfExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for OrPat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Param { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ParamList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ParenExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ParenPat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ParenType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ParenthesizedArgList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Path { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for PathExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for PathMeta { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for PathPat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for PathSegment { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for PathType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for PatternType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for PrefixExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for PtrType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for RangeExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for RangePat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for RecordExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for RecordExprField { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for RecordExprFieldList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for RecordField { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for RecordFieldList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for RecordPat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for RecordPatField { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for RecordPatFieldList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for RefExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for RefPat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for RefType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Rename { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for RestPat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for RetType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ReturnExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for ReturnTypeSyntax { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for SelfParam { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for SlicePat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for SliceType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for SourceFile { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Static { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for StmtList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Struct { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for TokenTree { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for TokenTreeMeta { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Trait { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for TryBlockModifier { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for TryExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for TupleExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for TupleField { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for TupleFieldList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for TuplePat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for TupleStructPat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for TupleType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for TypeAlias { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for TypeAnchor { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for TypeArg { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for TypeBound { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for TypeBoundList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for TypeParam { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for UnderscoreExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Union { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for UnsafeMeta { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Use { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for UseBoundGenericArgs { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for UseTree { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for UseTreeList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Variant { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for VariantList { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for Visibility { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for VisibilityInner { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for WhereClause { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for WherePred { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for WhileExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for WildcardPat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for YeetExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } impl std::fmt::Display for YieldExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } diff --git a/crates/syntax/src/ast/make.rs b/crates/syntax/src/ast/make.rs index 36f7b56e3cd2..611d8504e57c 100644 --- a/crates/syntax/src/ast/make.rs +++ b/crates/syntax/src/ast/make.rs @@ -248,7 +248,7 @@ pub fn item_list(body: Option>) -> ast::ItemList { let body_indent = if is_break_braces { " " } else { "" }; let body = match body { - Some(bd) => bd.iter().map(|elem| elem.to_string()).join("\n\n "), + Some(bd) => bd.iter().map(|elem| fragment_text(elem.syntax()).to_string()).join("\n\n "), None => String::new(), }; ast_from_text(&format!("mod C {{{body_newline}{body_indent}{body}{body_newline}}}")) @@ -265,7 +265,7 @@ pub fn assoc_item_list(body: Option>) -> ast::AssocItemList let body_indent = if is_break_braces { " ".to_owned() } else { String::new() }; let body = match body { - Some(bd) => bd.iter().map(|elem| elem.to_string()).join("\n\n "), + Some(bd) => bd.iter().map(|elem| fragment_text(elem.syntax()).to_string()).join("\n\n "), None => String::new(), }; ast_from_text(&format!("impl C for D {{{body_newline}{body_indent}{body}{body_newline}}}")) @@ -465,7 +465,7 @@ pub fn use_tree( add_star: bool, ) -> ast::UseTree { let mut buf = "use ".to_owned(); - buf += &path.syntax().to_string(); + format_to!(buf, "{path}"); if let Some(use_tree_list) = use_tree_list { format_to!(buf, "::{use_tree_list}"); } @@ -480,7 +480,8 @@ pub fn use_tree( } pub fn use_tree_list(use_trees: impl IntoIterator) -> ast::UseTreeList { - let use_trees = use_trees.into_iter().map(|it| it.syntax().clone()).join(", "); + let use_trees = + use_trees.into_iter().map(|it| fragment_text(it.syntax()).to_string()).join(", "); ast_from_text(&format!("use {{{use_trees}}};")) } @@ -490,7 +491,7 @@ pub fn use_( use_tree: ast::UseTree, ) -> ast::Use { let attrs = - attrs.into_iter().fold(String::new(), |mut acc, attr| format_to_acc!(acc, "{}\n", attr)); + attrs.into_iter().fold(String::new(), |mut acc, attr| format_to_acc!(acc, "{attr}\n")); let visibility = match visibility { None => String::new(), Some(it) => format!("{it} "), @@ -586,19 +587,36 @@ pub fn hacky_block_expr( elements: impl IntoIterator, tail_expr: Option, ) -> ast::BlockExpr { + let breaks = |trivia: &[rowan::GreenToken]| { + trivia + .iter() + .take_while(|it| { + matches!( + SyntaxKind::from(it.kind().0), + SyntaxKind::WHITESPACE | SyntaxKind::NEWLINE + ) + }) + .filter(|it| SyntaxKind::from(it.kind().0) == SyntaxKind::NEWLINE) + .count() + }; let mut buf = "{\n".to_owned(); + let mut after = 0; for node_or_token in elements.into_iter() { match node_or_token { - rowan::NodeOrToken::Node(n) => format_to!(buf, " {n}\n"), + rowan::NodeOrToken::Node(n) => { + let before = + n.first_non_trivia_token().map_or(0, |it| breaks(it.green().leading_trivia())); + for _ in 1..after + before { + buf.push('\n'); + } + after = + n.last_non_trivia_token().map_or(0, |it| breaks(it.green().trailing_trivia())); + format_to!(buf, " {}\n", fragment_text(&n)) + } rowan::NodeOrToken::Token(t) => { - let kind = t.kind(); - if kind == SyntaxKind::COMMENT { - format_to!(buf, " {t}\n") - } else if kind == SyntaxKind::WHITESPACE { - let content = t.text().trim_matches(|c| c != '\n'); - if !content.is_empty() { - format_to!(buf, "{}", &content[1..]) - } + if t.kind() == SyntaxKind::COMMENT { + after = 0; + format_to!(buf, " {}\n", t.text()) } } } @@ -747,7 +765,7 @@ pub fn expr_assignment(lhs: ast::Expr, rhs: ast::Expr) -> ast::BinExpr { expr_from_text(&format!("{lhs} = {rhs}")) } fn block_whitespace(after: &impl AstNode) -> &'static str { - if after.syntax().text().contains_char('\n') { "\n" } else { " " } + if after.syntax().text_without_outer_trivia().contains_char('\n') { "\n" } else { " " } } pub fn arg_list(args: impl IntoIterator) -> ast::ArgList { let args = args.into_iter().format(", "); @@ -995,7 +1013,8 @@ pub fn let_else_stmt( pub fn expr_stmt(expr: ast::Expr) -> ast::ExprStmt { let semi = if expr.is_block_like() { "" } else { ";" }; - ast_from_text(&format!("fn f() {{ {expr}{semi} (); }}")) + let expr = fragment_text(expr.syntax()); + ast_from_text(&format!("fn f() {{\n{expr}{semi} (); }}")) } pub fn item_const( @@ -1386,7 +1405,7 @@ fn expr_from_text_with_edition + AstNode>(text: &str, edition panic!("Failed to make expr node `{node}` from text `{text}`") } }; - let node = node.clone_subtree(); + let node = detach_fragment(node); assert_eq!(node.syntax().text_range().start(), 0.into()); node } @@ -1406,19 +1425,36 @@ fn ast_from_text_with_edition(text: &str, edition: Edition) -> N { panic!("Failed to make ast node `{node}` from text `{text}`") } }; - let node = node.clone_subtree(); + let node = detach_fragment(node); assert_eq!(node.syntax().text_range().start(), 0.into()); node } pub fn token(kind: SyntaxKind) -> SyntaxToken { - tokens::SOURCE_FILE + let token = tokens::SOURCE_FILE .tree() .syntax() .descendants_with_tokens() .filter_map(|it| it.into_token()) .find(|it| it.kind() == kind) - .unwrap_or_else(|| panic!("unhandled token: {kind:?}")) + .unwrap_or_else(|| panic!("unhandled token: {kind:?}")); + crate::syntax_node::token_payload(token.kind(), token.text(), Vec::new(), Vec::new()) +} + +fn fragment_text(node: &crate::SyntaxNode) -> crate::SyntaxText { + let blank = + |it: &SyntaxToken| matches!(it.kind(), SyntaxKind::WHITESPACE | SyntaxKind::NEWLINE); + let (Some(first), Some(last)) = (node.first_non_trivia_token(), node.last_non_trivia_token()) + else { + return node.text_without_outer_trivia(); + }; + let start = first.leading_trivia().find(|it| !blank(it)).unwrap_or(first).text_range().start(); + let end = last.trailing_trivia().rev().find(|it| !blank(it)).unwrap_or(last).text_range().end(); + node.text().slice(crate::TextRange::new(start, end) - node.text_range().start()) +} + +fn detach_fragment(node: N) -> N { + N::cast(crate::algo::strip_outer_blank_trivia(node.syntax())).unwrap() } pub mod tokens { @@ -1426,7 +1462,18 @@ pub mod tokens { use parser::Edition; - use crate::{AstNode, Parse, SourceFile, SyntaxKind::*, SyntaxToken, ast}; + use crate::{AstNode, Parse, SourceFile, SyntaxKind, SyntaxKind::*, SyntaxToken, ast}; + + pub fn trivia(text: &str) -> Vec<(SyntaxKind, &str)> { + let lexed = parser::LexedStr::new(Edition::CURRENT, text); + (0..lexed.len()) + .map(|index| { + let kind = lexed.kind(index); + debug_assert!(kind.is_trivia(), "expected whitespace or an ordinary comment"); + (kind, &text[lexed.text_range(index)]) + }) + .collect() + } pub(super) static SOURCE_FILE: LazyLock> = LazyLock::new(|| { SourceFile::parse( @@ -1435,16 +1482,11 @@ pub mod tokens { ) }); - pub fn whitespace(text: &str) -> SyntaxToken { - assert!(text.trim().is_empty()); - let sf = SourceFile::parse(text, Edition::CURRENT).ok().unwrap(); - sf.syntax().first_child_or_token().unwrap().into_token().unwrap() - } - pub fn doc_comment(text: &str) -> SyntaxToken { assert!(!text.trim().is_empty()); - let sf = SourceFile::parse(text, Edition::CURRENT).ok().unwrap(); - sf.syntax().first_child_or_token().unwrap().into_token().unwrap() + let (kind, _) = parser::LexedStr::single_token(Edition::CURRENT, text) + .expect("a doc comment is a single token"); + crate::syntax_node::token_payload(kind, text, Vec::new(), Vec::new()) } pub fn literal(text: &str) -> SyntaxToken { diff --git a/crates/syntax/src/ast/make/quote.rs b/crates/syntax/src/ast/make/quote.rs index 300ef25c137c..008321afe01b 100644 --- a/crates/syntax/src/ast/make/quote.rs +++ b/crates/syntax/src/ast/make/quote.rs @@ -58,12 +58,7 @@ macro_rules! quote_impl_ { $($rest:tt)* ) => { const { $crate::ast::make::quote::verify_only_whitespaces($whitespace) }; - $children.push($crate::ast::make::quote::NodeOrToken::Token( - $crate::ast::make::quote::GreenToken::new( - $crate::ast::make::quote::RSyntaxKind($crate::SyntaxKind::WHITESPACE as u16), - $whitespace, - ), - )); + $crate::ast::make::quote::push_whitespace(&mut $children, $whitespace); $crate::ast::make::quote::quote_impl!( @append $children $($rest)* ); }; @@ -148,13 +143,86 @@ macro_rules! quote_ { >>::with_capacity(1); $crate::ast::make::quote::quote_impl!( @append root $root { $($tree)* } ); let root = root.into_iter().next().unwrap(); - let root = $crate::SyntaxNode::new_root(root.into_node().unwrap()); + let root = $crate::ast::make::quote::attach_trivia(&root.into_node().unwrap()); + let root = $crate::SyntaxNode::new_root(root); <$crate::ast::$root as $crate::ast::AstNode>::cast(root).unwrap() }}; } pub(crate) use quote_ as quote; -use crate::AstNode; +use crate::{AstNode, SyntaxKind, SyntaxKind::NEWLINE}; + +pub(crate) fn push_whitespace(children: &mut Vec>, text: &str) { + let trivia = crate::ast::make::tokens::trivia(text); + children.extend( + trivia + .into_iter() + .map(|(kind, text)| GreenToken::new(RSyntaxKind(kind as u16), text).into()), + ); +} + +enum Piece { + Enter(RSyntaxKind), + Exit, + Token(GreenToken, Vec, Vec), +} + +fn kind(token: &rowan::GreenTokenData) -> SyntaxKind { + SyntaxKind::from(token.kind().0) +} + +fn flatten(node: &rowan::GreenNodeData, pieces: &mut Vec, leading: &mut Vec) { + pieces.push(Piece::Enter(node.kind())); + for child in node.children() { + match child { + NodeOrToken::Node(node) => flatten(node, pieces, leading), + NodeOrToken::Token(token) if !kind(token).is_trivia() => { + leading.extend(token.leading_trivia().iter().cloned()); + let trailing = token.trailing_trivia().to_vec(); + pieces.push(Piece::Token(token.to_owned(), std::mem::take(leading), trailing)); + } + NodeOrToken::Token(trivia) => { + let open = pieces.iter_mut().rev().find_map(|piece| match piece { + Piece::Token(_, _, trailing) => Some(trailing), + _ => None, + }); + match open { + Some(trailing) if !trailing.last().is_some_and(|it| kind(it) == NEWLINE) => { + trailing.push(trivia.to_owned()) + } + _ => leading.push(trivia.to_owned()), + } + } + } + } + pieces.push(Piece::Exit); +} + +pub(crate) fn attach_trivia(root: &GreenNode) -> GreenNode { + let (mut pieces, mut leading) = (Vec::new(), Vec::new()); + flatten(root, &mut pieces, &mut leading); + debug_assert!(leading.is_empty(), "trivia needs a following token"); + + let mut frames: Vec<(RSyntaxKind, Vec>)> = Vec::new(); + for piece in pieces { + match piece { + Piece::Enter(kind) => frames.push((kind, Vec::new())), + Piece::Token(token, leading, trailing) => { + let token = GreenToken::with_trivia(token.kind(), token.text(), leading, trailing); + frames.last_mut().expect("a token outside any node").1.push(token.into()); + } + Piece::Exit => { + let (kind, children) = frames.pop().expect("an exit for every enter"); + let node = GreenNode::new(kind, children); + match frames.last_mut() { + Some((_, parent)) => parent.push(node.into()), + None => return node, + } + } + } + } + unreachable!("the root exits last") +} pub(crate) trait ToNodeChild { fn append_node_child(self, children: &mut Vec>); @@ -162,7 +230,8 @@ pub(crate) trait ToNodeChild { impl ToNodeChild for N { fn append_node_child(self, children: &mut Vec>) { - children.push((*self.syntax().clone_subtree().green()).to_owned().into()); + let detached = crate::algo::strip_outer_blank_trivia(self.syntax()); + children.push(detached.green().to_owned().into()); } } diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs index eef314175ae1..823d0aec2e0c 100644 --- a/crates/syntax/src/ast/node_ext.rs +++ b/crates/syntax/src/ast/node_ext.rs @@ -11,7 +11,7 @@ use rowan::{GreenNodeData, GreenTokenData, TextSize}; use smallvec::{SmallVec, smallvec}; use crate::{ - NodeOrToken, SmolStr, SyntaxElement, SyntaxElementChildren, SyntaxToken, T, + NodeOrToken, SmolStr, SyntaxElement, SyntaxElementChildren, SyntaxToken, T, algo, ast::{ self, AnyComment, AstNode, AstToken, CommentShape, HasAttrs, HasGenericArgs, HasGenericParams, HasName, HasTypeBounds, SyntaxNode, support, @@ -43,7 +43,7 @@ impl ast::NameRef { } pub fn token_kind(&self) -> SyntaxKind { - self.syntax().first_token().map_or(SyntaxKind::ERROR, |it| it.kind()) + self.syntax().first_non_trivia_token().map_or(SyntaxKind::ERROR, |it| it.kind()) } } @@ -58,7 +58,9 @@ fn text_of_first_token(node: &SyntaxNode) -> &str { fn into_comma(it: NodeOrToken) -> Option { let token = match it { NodeOrToken::Token(it) => it, - NodeOrToken::Node(node) if node.kind() == SyntaxKind::ERROR => node.first_token()?, + NodeOrToken::Node(node) if node.kind() == SyntaxKind::ERROR => { + node.first_non_trivia_token()? + } NodeOrToken::Node(_) => return None, }; (token.kind() == T![,]).then_some(token) @@ -201,7 +203,9 @@ impl ast::Meta { _ => { let path = self.path()?; match (path.segment(), path.qualifier()) { - (Some(segment), None) => Some(segment.syntax().first_token()?.text().into()), + (Some(segment), None) => { + Some(segment.syntax().first_non_trivia_token()?.text().into()) + } _ => None, } } @@ -284,7 +288,7 @@ impl ast::DocComment { pub fn token(&self) -> AnyComment { self.syntax - .first_token() + .first_non_trivia_token() .and_then(ast::AnyComment::cast) .expect("`ast::DocComment` must have a comment token") } @@ -468,9 +472,15 @@ impl ast::UseTreeList { pub fn has_inner_comment(&self) -> bool { self.syntax() .children_with_tokens() - .filter_map(|it| it.into_token()) - .find_map(ast::Comment::cast) - .is_some() + .filter(|child| child.kind() != T!['{']) + .filter_map(|child| child.first_non_trivia_token()) + .any(|first| { + let before_first = + first.prev_non_trivia_token().into_iter().flat_map(|it| it.trailing_trivia()); + before_first + .chain(first.leading_trivia()) + .any(|it| it.kind() == SyntaxKind::COMMENT) + }) } pub fn comma(&self) -> impl Iterator { @@ -503,9 +513,27 @@ impl ast::UseTreeList { let remove_brace_in_use_tree_list = |u: &ast::UseTreeList| { if has_single_subtree_that_is_not_self(u) { if let Some(a) = u.l_curly_token() { - editor.delete(a) + if let Some(next) = a.next_non_trivia_token() + && let Some(pending) = editor.pending_token(&next) + { + let blank = algo::outer_blank_trivia( + &pending, + crate::syntax_editor::TriviaSide::Leading, + ); + editor.splice_leading_trivia(&next, blank, []); + } + editor.delete_keeping_leading(a) } if let Some(a) = u.r_curly_token() { + if let Some(prev) = a.prev_non_trivia_token() + && let Some(pending) = editor.pending_token(&prev) + { + let blank = algo::outer_blank_trivia( + &pending, + crate::syntax_editor::TriviaSide::Trailing, + ); + editor.splice_trailing_trivia(&prev, blank, []); + } editor.delete(a) } u.comma().for_each(|u| editor.delete(u)); @@ -1219,8 +1247,7 @@ impl From for ast::AnyHasAttrs { impl ast::OrPat { pub fn leading_pipe(&self) -> Option { self.syntax - .children_with_tokens() - .find(|it| !it.kind().is_trivia()) + .first_child_or_token() .and_then(NodeOrToken::into_token) .filter(|it| it.kind() == T![|]) } @@ -1271,11 +1298,7 @@ impl Iterator for TokenTreeChildren { NodeOrToken::Node(node) => ast::TokenTree::cast(node).map(NodeOrToken::Node), NodeOrToken::Token(token) => { let kind = token.kind(); - (!matches!( - kind, - SyntaxKind::WHITESPACE | SyntaxKind::COMMENT | T![')'] | T![']'] | T!['}'] - )) - .then_some(NodeOrToken::Token(token)) + (!matches!(kind, T![')'] | T![']'] | T!['}'])).then_some(NodeOrToken::Token(token)) } }) } diff --git a/crates/syntax/src/ast/prec.rs b/crates/syntax/src/ast/prec.rs index f473df9b1548..8fcd2a453987 100644 --- a/crates/syntax/src/ast/prec.rs +++ b/crates/syntax/src/ast/prec.rs @@ -3,8 +3,7 @@ use stdx::always; use crate::{ - AstNode, Direction, SyntaxNode, T, - algo::skip_trivia_token, + AstNode, SyntaxNode, T, ast::{self, BinaryOp, Expr, HasArgList, RangeItem}, match_ast, }; @@ -156,8 +155,7 @@ fn check_ancestry(ancestor: &SyntaxNode, descendent: &SyntaxNode) -> bool { } fn next_token_of(node: &SyntaxNode) -> Option { - let last = node.last_token()?; - skip_trivia_token(last.next_token()?, Direction::Next) + node.last_non_trivia_token()?.next_non_trivia_token() } impl Expr { @@ -244,7 +242,11 @@ impl Expr { // Special-case `2 as x < 3` if let ast::Expr::CastExpr(it) = self && let Some(ty) = it.ty() - && ty.syntax().last_token().and_then(|it| ast::NameLike::cast(it.parent()?)).is_some() + && ty + .syntax() + .last_non_trivia_token() + .and_then(|it| ast::NameLike::cast(it.parent()?)) + .is_some() && let Some(node) = place_of_parent() && let Some(next) = next_token_of(&node) && matches!(next.kind(), T![<] | T![<<]) diff --git a/crates/syntax/src/ast/syntax_factory.rs b/crates/syntax/src/ast/syntax_factory.rs index 9369a4e700cb..19463ad589e0 100644 --- a/crates/syntax/src/ast/syntax_factory.rs +++ b/crates/syntax/src/ast/syntax_factory.rs @@ -3,14 +3,18 @@ //! //! Instead of forcing make constructors to perform syntax mapping, we instead //! let [`SyntaxFactory`] handle constructing the mappings. Care must be taken -//! to remember to feed the syntax mappings into a [`SyntaxEditor`](crate::syntax_editor::SyntaxEditor), +//! to remember to feed the syntax mappings into a [`SyntaxEditor`], //! if applicable. mod constructors; use std::cell::{RefCell, RefMut}; -use crate::syntax_editor::SyntaxMapping; +use crate::{ + SyntaxElement, SyntaxKind, SyntaxNode, + ast::make, + syntax_editor::{Element, SyntaxEditor, SyntaxMapping, SyntaxMappingBuilder}, +}; #[derive(Debug)] pub struct SyntaxFactory { @@ -19,6 +23,70 @@ pub struct SyntaxFactory { } impl SyntaxFactory { + pub fn with_leading_trivia(&self, element: impl Element, text: &str) -> SyntaxElement { + self.with_trivia(element.syntax_element(), text, crate::syntax_editor::TriviaSide::Leading) + } + + pub fn with_trailing_trivia(&self, element: impl Element, text: &str) -> SyntaxElement { + self.with_trivia(element.syntax_element(), text, crate::syntax_editor::TriviaSide::Trailing) + } + + pub fn prepend_leading_trivia(&self, element: impl Element, text: &str) -> SyntaxElement { + let element = element.syntax_element(); + let existing: String = element + .first_non_trivia_token() + .map(|token| token.leading_trivia().map(|it| it.text().to_owned()).collect()) + .unwrap_or_default(); + self.with_trivia( + element, + &format!("{text}{existing}"), + crate::syntax_editor::TriviaSide::Leading, + ) + } + + fn with_trivia( + &self, + element: SyntaxElement, + text: &str, + side: crate::syntax_editor::TriviaSide, + ) -> SyntaxElement { + debug_assert!( + self.mappings.is_some(), + "decorate through the editor's factory, not one without mappings" + ); + let green = match &element { + SyntaxElement::Node(node) => rowan::NodeOrToken::Node(node.green().to_owned()), + SyntaxElement::Token(token) => rowan::NodeOrToken::Token(token.green().to_owned()), + }; + let root = SyntaxNode::new_root(rowan::GreenNode::new( + rowan::SyntaxKind(SyntaxKind::ERROR as u16), + [green], + )); + let (editor, root) = SyntaxEditor::new(root); + match side { + crate::syntax_editor::TriviaSide::Leading => { + if let Some(token) = root.first_non_trivia_token() { + editor.splice_leading_trivia(&token, .., make::tokens::trivia(text)); + } + } + crate::syntax_editor::TriviaSide::Trailing => { + if let Some(token) = root.last_non_trivia_token() { + editor.splice_trailing_trivia(&token, .., make::tokens::trivia(text)); + } + } + } + let edit = editor.finish(); + let output = edit.new_root().first_child_or_token().unwrap(); + if let SyntaxElement::Node(input) = element + && let Some(mut mappings) = self.mappings() + { + let mut builder = SyntaxMappingBuilder::new(edit.new_root().clone()); + builder.map_node(input, output.as_node().unwrap().clone()); + builder.finish(&mut mappings); + } + output + } + /// Creates a new [`SyntaxFactory`], generating mappings between input nodes and generated nodes. pub(crate) fn with_mappings() -> Self { Self { mappings: Some(RefCell::new(SyntaxMapping::default())) } diff --git a/crates/syntax/src/ast/syntax_factory/constructors.rs b/crates/syntax/src/ast/syntax_factory/constructors.rs index 23fb0e2e0278..ea75a57363dc 100644 --- a/crates/syntax/src/ast/syntax_factory/constructors.rs +++ b/crates/syntax/src/ast/syntax_factory/constructors.rs @@ -2111,10 +2111,6 @@ impl SyntaxFactory { make::token(kind) } - pub fn whitespace(&self, text: &str) -> SyntaxToken { - make::tokens::whitespace(text) - } - pub fn ident(&self, text: &str) -> SyntaxToken { make::tokens::ident(text) } diff --git a/crates/syntax/src/ast/token_ext.rs b/crates/syntax/src/ast/token_ext.rs index 07240265da19..4476f0204508 100644 --- a/crates/syntax/src/ast/token_ext.rs +++ b/crates/syntax/src/ast/token_ext.rs @@ -149,13 +149,6 @@ impl AnyComment { } } -impl ast::Whitespace { - pub fn spans_multiple_lines(&self) -> bool { - let text = self.text(); - text.find('\n').is_some_and(|idx| text[idx + 1..].contains('\n')) - } -} - #[derive(Debug)] pub struct QuoteOffsets { pub quotes: (TextRange, TextRange), diff --git a/crates/syntax/src/hacks.rs b/crates/syntax/src/hacks.rs index 51b878aff7f1..46cc68287d6c 100644 --- a/crates/syntax/src/hacks.rs +++ b/crates/syntax/src/hacks.rs @@ -18,5 +18,5 @@ pub fn parse_expr_from_str(s: &str, edition: Edition) -> Option { // Can't check the text because the original text may contain whitespace and comments. // Wrap in parentheses to better allow for verification. Of course, the real fix is // to get rid of this hack. - expr.expr() + expr.expr().map(|it| crate::ast::edit::AstNodeEdit::detached(&it)) } diff --git a/crates/syntax/src/lib.rs b/crates/syntax/src/lib.rs index dc7d7af7a2b9..dcc47eeeff87 100644 --- a/crates/syntax/src/lib.rs +++ b/crates/syntax/src/lib.rs @@ -355,21 +355,19 @@ fn api_walkthrough() { // The two properties each syntax node has is a `SyntaxKind`: assert_eq!(expr_syntax.kind(), SyntaxKind::BIN_EXPR); - // And text range: - assert_eq!(expr_syntax.text_range(), TextRange::new(32.into(), 37.into())); + assert_eq!(expr_syntax.text_range(), TextRange::new(20.into(), 38.into())); + assert_eq!(expr_syntax.text_range_without_outer_trivia(), TextRange::new(32.into(), 37.into())); // You can get node's text as a `SyntaxText` object, which will traverse the // tree collecting token's text: let text: SyntaxText = expr_syntax.text(); - assert_eq!(text.to_string(), "1 + 1"); + assert_eq!(expr_syntax.text_without_outer_trivia().to_string(), "1 + 1"); + assert_eq!(text.to_string(), " 1 + 1\n"); // There's a bunch of traversal methods on `SyntaxNode`: assert_eq!(expr_syntax.parent().as_ref(), Some(stmt_list.syntax())); assert_eq!(stmt_list.syntax().first_child_or_token().map(|it| it.kind()), Some(T!['{'])); - assert_eq!( - expr_syntax.next_sibling_or_token().map(|it| it.kind()), - Some(SyntaxKind::WHITESPACE) - ); + assert_eq!(expr_syntax.next_sibling_or_token().map(|it| it.kind()), Some(T!['}'])); // As well as some iterator helpers: let f = expr_syntax.ancestors().find_map(ast::Fn::cast); @@ -377,7 +375,7 @@ fn api_walkthrough() { assert!(expr_syntax.siblings_with_tokens(Direction::Next).any(|it| it.kind() == T!['}'])); assert_eq!( expr_syntax.descendants_with_tokens().count(), - 8, // 5 tokens `1`, ` `, `+`, ` `, `1` + 6, // 3 tokens `1`, `+`, `1` // 2 child literal expressions: `1`, `1` // 1 the node itself: `1 + 1` ); @@ -389,7 +387,7 @@ fn api_walkthrough() { match event { WalkEvent::Enter(node) => { let text = match &node { - NodeOrToken::Node(it) => it.text().to_string(), + NodeOrToken::Node(it) => it.text_without_outer_trivia().to_string(), NodeOrToken::Token(it) => it.text().to_owned(), }; format_to!(buf, "{:indent$}{:?} {:?}\n", " ", text, node.kind(), indent = indent); @@ -405,9 +403,7 @@ fn api_walkthrough() { "1 + 1" BIN_EXPR "1" LITERAL "1" INT_NUMBER - " " WHITESPACE "+" PLUS - " " WHITESPACE "1" LITERAL "1" INT_NUMBER "# @@ -424,7 +420,7 @@ fn api_walkthrough() { .syntax() .descendants() .filter_map(ast::Expr::cast) - .map(|expr| expr.syntax().text().to_string()) + .map(|expr| expr.syntax().text_without_outer_trivia().to_string()) .collect(); // An alternative is to use a macro. @@ -433,7 +429,7 @@ fn api_walkthrough() { match_ast! { match node { ast::Expr(it) => { - let res = it.syntax().text().to_string(); + let res = it.syntax().text_without_outer_trivia().to_string(); exprs_visit.push(res); }, _ => (), diff --git a/crates/syntax/src/parsing.rs b/crates/syntax/src/parsing.rs index 249c81a1f37b..b8ee38986340 100644 --- a/crates/syntax/src/parsing.rs +++ b/crates/syntax/src/parsing.rs @@ -39,7 +39,9 @@ pub(crate) fn build_tree( let mut builder = SyntaxTreeBuilder::default(); let is_eof = lexed.intersperse_trivia(&parser_output, &mut |step| match step { - parser::StrStep::Token { kind, text } => builder.token(kind, text), + parser::StrStep::Token { kind, text, leading, trailing } => { + builder.token_with_trivia(kind, text, leading, trailing) + } parser::StrStep::Enter { kind } => builder.start_node(kind), parser::StrStep::Exit => builder.finish_node(), parser::StrStep::Error { msg, pos } => { diff --git a/crates/syntax/src/parsing/reparsing.rs b/crates/syntax/src/parsing/reparsing.rs index df1d6a1713d1..0cecf1909e55 100644 --- a/crates/syntax/src/parsing/reparsing.rs +++ b/crates/syntax/src/parsing/reparsing.rs @@ -11,11 +11,11 @@ use std::ops::Range; use parser::{Edition, Reparser}; use crate::{ - SyntaxError, + SyntaxError, SyntaxKind, SyntaxKind::*, T, TextRange, TextSize, parsing::build_tree, - syntax_node::{GreenNode, GreenToken, NodeOrToken, SyntaxElement, SyntaxNode}, + syntax_node::{GreenNode, NodeOrToken, SyntaxElement, SyntaxNode}, }; pub(crate) fn incremental_reparse( @@ -49,18 +49,16 @@ fn reparse_token( insert: &str, edition: Edition, ) -> Option<(GreenNode, Vec, TextRange)> { - let prev_token = root.covering_element(delete).as_token()?.clone(); + let mut prev_token = root.covering_element(delete).as_token()?.clone(); + if prev_token.kind() == EOF { + prev_token = prev_token.prev_non_trivia_token()?; + } + if prev_token.is_trivia() || !prev_token.text_range().contains_range(delete) { + return None; + } let prev_token_kind = prev_token.kind(); match prev_token_kind { - WHITESPACE | COMMENT | IDENT | STRING | BYTE_STRING | C_STRING => { - if prev_token_kind == WHITESPACE || prev_token_kind == COMMENT { - // removing a new line may extends previous token - let deleted_range = delete - prev_token.text_range().start(); - if prev_token.text()[deleted_range].contains('\n') { - return None; - } - } - + IDENT | STRING | BYTE_STRING | C_STRING => { let mut new_text = get_text_after_edit(prev_token.clone().into(), delete, insert); let (new_token_kind, new_err) = parser::LexedStr::single_token(edition, &new_text)?; @@ -82,7 +80,13 @@ fn reparse_token( new_text.pop(); } - let new_token = GreenToken::new(rowan::SyntaxKind(prev_token_kind.into()), &new_text); + let green = prev_token.green(); + let new_token = rowan::GreenToken::with_trivia( + green.kind(), + &new_text, + green.leading_trivia().to_vec(), + green.trailing_trivia().to_vec(), + ); let range = TextRange::up_to(TextSize::of(&new_text)); Some(( prev_token.replace_with(new_token), @@ -105,7 +109,7 @@ fn reparse_block( let lexed = parser::LexedStr::new(edition, text.as_str()); let parser_input = lexed.to_input(edition); - if !is_balanced(&lexed) { + if !is_balanced(&lexed) || ends_in_open_comment(&lexed) { return None; } @@ -113,6 +117,20 @@ fn reparse_block( let (green, new_parser_errors, _eof) = build_tree(lexed, tree_traversal); + let last = green.children().len().checked_sub(1)?; + let green = match green.children().next_back()? { + NodeOrToken::Token(token) if SyntaxKind::from(token.kind().0) == EOF => { + if !token.leading_trivia().is_empty() || !token.trailing_trivia().is_empty() { + return None; + } + green.remove_child(last) + } + _ => green, + }; + if green.text_len() != TextSize::of(text.as_str()) { + return None; + } + Some((node.replace_with(green), new_parser_errors, node.text_range())) } @@ -141,12 +159,22 @@ fn find_reparsable_node(node: &SyntaxNode, range: TextRange) -> Option<(SyntaxNo }) } +fn ends_in_open_comment(lexed: &parser::LexedStr<'_>) -> bool { + let Some(last) = lexed.len().checked_sub(1) else { return false }; + lexed.kind(last) == COMMENT + && (lexed.text(last).starts_with("//") || lexed.error(last).is_some()) +} + fn is_balanced(lexed: &parser::LexedStr<'_>) -> bool { - if lexed.is_empty() || lexed.kind(0) != T!['{'] || lexed.kind(lexed.len() - 1) != T!['}'] { + let mut structural = (0..lexed.len()).filter(|&it| !lexed.kind(it).is_trivia()); + let (Some(first), Some(last)) = (structural.next(), structural.next_back()) else { + return false; + }; + if lexed.kind(first) != T!['{'] || lexed.kind(last) != T!['}'] { return false; } let mut balance = 0usize; - for i in 1..lexed.len() - 1 { + for i in first + 1..last { match lexed.kind(i) { T!['{'] => balance += 1, T!['}'] => { @@ -198,7 +226,8 @@ mod tests { use super::*; use crate::{AstNode, Parse, SourceFile}; - fn do_check(before: &str, replace_with: &str, reparsed_len: u32) { + fn do_check(before: &str, replace_with: &str, reparsed_len: impl Into>) { + let reparsed_len = reparsed_len.into(); let (range, before) = extract_range(before); let after = { let mut after = before.clone(); @@ -209,16 +238,29 @@ mod tests { let fully_reparsed = SourceFile::parse(&after, Edition::CURRENT); let incrementally_reparsed: Parse = { let before = SourceFile::parse(&before, Edition::CURRENT); - let (green, new_errors, range) = incremental_reparse( + let reparsed = incremental_reparse( before.tree().syntax(), range, replace_with, before.errors.as_deref().unwrap_or_default().iter().cloned(), Edition::CURRENT, - ) - .unwrap(); - assert_eq!(range.len(), reparsed_len.into(), "reparsed fragment has wrong length"); - Parse::new(green, new_errors) + ); + match reparsed { + Some((green, new_errors, reparsed_range)) => { + if let Some(expected) = reparsed_len { + assert_eq!( + reparsed_range.len(), + expected.into(), + "reparsed fragment has wrong length" + ); + } + Parse::new(green, new_errors) + } + None => { + assert!(reparsed_len.is_none(), "expected an incremental reparse"); + before.reparse(range, replace_with, Edition::CURRENT) + } + } }; assert_eq_text!( @@ -246,7 +288,7 @@ fn foo() { } ", "baz", - 25, + 26, ); do_check( r" @@ -255,7 +297,7 @@ struct Foo { } ", ",\n g: (),", - 14, + 15, ); do_check( r" @@ -266,7 +308,7 @@ fn foo { } ", "62", - 31, // FIXME: reparse only int literal here + 32, // FIXME: reparse only int literal here ); do_check( r" @@ -275,7 +317,7 @@ mod foo { } ", "bar", - 11, + 12, ); do_check( @@ -294,7 +336,7 @@ impl IntoIterator for Foo { } ", "n next(", - 9, + 10, ); do_check(r"use a::b::{foo,$0,bar$0};", "baz", 10); do_check( @@ -304,14 +346,14 @@ pub enum A { } ", "\nBar;\n", - 11, + 12, ); do_check( r" foo!{a, b$0$0 d} ", ", c[3]", - 8, + 9, ); do_check( r" @@ -320,7 +362,7 @@ fn foo() { } ", "123", - 14, + 15, ); do_check( r" @@ -329,7 +371,7 @@ extern { } ", " exit(code: c_int)", - 11, + 12, ); } @@ -340,49 +382,50 @@ extern { fn foo() -> i32 { 1 } ", "\n\n\n \n", - 1, + None, ); do_check( r" fn foo() -> $0$0 {} ", " \n", - 2, + None, ); do_check( r" -fn $0foo$0() -> i32 { 1 } +fn f() {} // before + fn $0foo$0() {} // after ", "bar", 3, ); do_check( r" -fn foo$0$0foo() { } +fn $0foo$0() -> i32 { 1 } ", "bar", - 6, + 3, ); do_check( r" -fn foo /* $0$0 */ () {} +fn foo$0$0foo() { } ", - "some comment", + "bar", 6, ); do_check( r" -fn baz $0$0 () {} +fn foo /* $0$0 */ () {} ", - " \t\t\n\n", - 2, + "some comment", + None, ); do_check( r" fn baz $0$0 () {} ", " \t\t\n\n", - 2, + None, ); do_check( r#" @@ -396,7 +439,7 @@ fn -> &str { "Hello$0$0" } fn -> &str { // "Hello$0$0" "#, ", world", - 10, + None, ); do_check( r##" diff --git a/crates/syntax/src/syntax_editor.rs b/crates/syntax/src/syntax_editor.rs index 3ddc7914760e..6dc879b29c02 100644 --- a/crates/syntax/src/syntax_editor.rs +++ b/crates/syntax/src/syntax_editor.rs @@ -6,9 +6,9 @@ use std::{ cell::RefCell, - fmt, iter, + fmt, num::NonZeroU32, - ops::RangeInclusive, + ops::{RangeBounds, RangeInclusive}, sync::atomic::{AtomicU32, Ordering}, }; @@ -16,8 +16,9 @@ use rowan::TextRange; use rustc_hash::FxHashMap; use crate::{ - AstNode, SyntaxElement, SyntaxKind, SyntaxNode, SyntaxToken, T, + AstNode, Direction, SyntaxElement, SyntaxKind, SyntaxNode, SyntaxToken, T, ast::{self, edit::IndentLevel, syntax_factory::SyntaxFactory}, + syntax_node::token_payload, }; mod edit_algo; @@ -27,6 +28,12 @@ mod mapping; pub use edits::{GetOrCreateWhereClause, Removable}; pub use mapping::{SyntaxMapping, SyntaxMappingBuilder}; +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum TriviaSide { + Leading, + Trailing, +} + #[derive(Debug)] pub struct SyntaxEditor { root: SyntaxNode, @@ -73,13 +80,42 @@ impl SyntaxEditor { } pub fn add_annotation(&self, element: impl Element, annotation: SyntaxAnnotation) { - self.annotations.borrow_mut().push((element.syntax_element(), annotation)) + let element = element.syntax_element(); + debug_assert!(!element.is_trivia(), "trivia cannot carry an annotation"); + self.annotations.borrow_mut().push((element, annotation)) } pub fn add_annotation_all(&self, elements: Vec, annotation: SyntaxAnnotation) { - self.annotations - .borrow_mut() - .extend(elements.into_iter().map(|e| e.syntax_element()).zip(iter::repeat(annotation))); + for element in elements { + self.add_annotation(element, annotation); + } + } + + pub(super) fn with_trivia( + &self, + element: &SyntaxElement, + side: TriviaSide, + text: &str, + ) -> SyntaxElement { + let decorated = match side { + TriviaSide::Leading => self.make.with_leading_trivia(element, text), + TriviaSide::Trailing => self.make.with_trailing_trivia(element, text), + }; + self.transfer_annotations(element, &decorated); + decorated + } + + fn transfer_annotations(&self, from: &SyntaxElement, to: &SyntaxElement) { + if from.as_token().is_none() { + return; + } + let mut annotations = self.annotations.borrow_mut(); + let transferred: Vec<_> = annotations + .iter() + .filter(|(annotated, _)| annotated == from) + .map(|(_, annotation)| (to.clone(), *annotation)) + .collect(); + annotations.extend(transferred); } pub fn merge(&self, other: SyntaxEditor) { @@ -99,55 +135,263 @@ impl SyntaxEditor { pub fn insert(&self, position: Position, element: impl Element) { debug_assert!(is_ancestor_or_self(&position.parent(), &self.root)); - self.changes.borrow_mut().push(Change::Insert(position, element.syntax_element())) + let element = element.syntax_element(); + self.make_room_at(&position, &element); + let element = self.take_line_break(&position, element); + self.changes.borrow_mut().push(Change::Insert(position, element)) } - pub fn insert_all(&self, position: Position, elements: Vec) { + pub fn insert_all(&self, position: Position, mut elements: Vec) { debug_assert!(is_ancestor_or_self(&position.parent(), &self.root)); + if let Some(first) = elements.first().cloned() { + self.make_room_at(&position, &first); + elements[0] = self.take_line_break(&position, first); + } self.changes.borrow_mut().push(Change::InsertAll(position, elements)) } - pub fn insert_with_whitespace(&self, position: Position, element: impl Element) { - self.insert_all_with_whitespace(position, vec![element.syntax_element()]) + fn take_line_break(&self, position: &Position, element: SyntaxElement) -> SyntaxElement { + let PositionRepr::Before(anchor) = &position.repr else { return element }; + let Some(token) = anchor.first_non_trivia_token() else { return element }; + if !is_ancestor_or_self_of_element(&SyntaxElement::Token(token.clone()), &self.root) { + return element; + } + let starts_own_line = element + .first_non_trivia_token() + .and_then(|it| it.leading_trivia().next()) + .is_some_and(|it| it.kind() == SyntaxKind::NEWLINE); + match starts_own_line { + true => self.open_line_before(&token, element), + false => self.take_anchor_line_prefix(&token, element), + } } - pub fn insert_all_with_whitespace(&self, position: Position, mut elements: Vec) { - if let Some(first) = elements.first() - && let Some(ws) = ws_before(&position, first, &self.make) + fn open_line_before(&self, token: &SyntaxToken, element: SyntaxElement) -> SyntaxElement { + if let Some(decorated) = self.take_comment_lines(token, &element) { + return decorated; + } + if let Some(prev) = self.surviving_token(token, Direction::Prev) + && is_ancestor_or_self_of_element(&SyntaxElement::Token(prev.clone()), &self.root) + && !self.covered_by(prev.text_range(), |_| true) + && let Some(pending) = self.pending_token(&prev) { - elements.insert(0, ws.into()); + let blank = crate::algo::outer_blank_trivia(&pending, TriviaSide::Trailing); + let mut tail = pending.trailing_trivia().skip(blank.start); + if tail.any(|it| it.kind() == SyntaxKind::NEWLINE) { + self.splice_trailing_trivia(&prev, blank, []); + } } - if let Some(last) = elements.last() - && let Some(ws) = ws_after(&position, last, &self.make) + let Some(pending) = self.pending_token(token) else { return element }; + let end = pending + .leading_trivia() + .position(|it| it.kind() != SyntaxKind::WHITESPACE) + .unwrap_or(0); + let opens_line = + pending.leading_trivia().nth(end).is_some_and(|it| it.kind() == SyntaxKind::NEWLINE); + if end > 0 && opens_line { + self.splice_leading_trivia(token, ..end, []); + } + let anchor_keeps_its_lines = + pending.leading_trivia().any(|it| it.kind() == SyntaxKind::COMMENT); + let Some(last) = element.last_non_trivia_token() else { return element }; + if !anchor_keeps_its_lines + || last.trailing_trivia().next_back().is_some_and(|it| it.kind() == SyntaxKind::NEWLINE) + { + return element; + } + let trailing: String = last.trailing_trivia().map(|it| it.text().to_owned()).collect(); + self.with_trivia(&element, TriviaSide::Trailing, &format!("{trailing}\n")) + } + + fn take_anchor_line_prefix( + &self, + token: &SyntaxToken, + element: SyntaxElement, + ) -> SyntaxElement { + if token.prev_non_trivia_token().is_none() { + return element; + } + let Some(pending) = self.pending_token(token) else { return element }; + let Some(end) = pending + .leading_trivia() + .rposition(|it| it.kind() == SyntaxKind::NEWLINE) + .map(|index| index + 1) + else { + return element; + }; + let comment_attached_to_anchor = pending + .leading_trivia() + .take(end) + .rposition(|it| it.kind() == SyntaxKind::COMMENT) + .is_some_and(|comment| { + pending + .leading_trivia() + .take(end) + .skip(comment + 1) + .filter(|it| it.kind() == SyntaxKind::NEWLINE) + .count() + < 2 + }); + if comment_attached_to_anchor { + return element; + } + self.move_leading_trivia(token, end, element) + } + + fn take_comment_lines( + &self, + token: &SyntaxToken, + element: &SyntaxElement, + ) -> Option { + let pending = self.pending_token(token)?; + let first = pending.leading_trivia().position(|it| it.kind() == SyntaxKind::COMMENT)?; + let newline = |it: &SyntaxToken| it.kind() == SyntaxKind::NEWLINE; + let blank_lines_before = self + .surviving_token(token, Direction::Prev) + .and_then(|prev| self.pending_token(&prev)) + .map_or(0, |prev| prev.trailing_trivia().filter(newline).count()) + + pending.leading_trivia().take(first).filter(newline).count(); + if blank_lines_before > 1 { + return None; + } + let end = pending.leading_trivia().rposition(|it| it.kind() == SyntaxKind::COMMENT)? + 1; + if !matches!(token.kind(), T!['}'] | T![')'] | T![']']) + && pending.leading_trivia().skip(end).filter(newline).count() < 2 { - elements.push(ws.into()); + return None; + } + Some(self.move_leading_trivia(token, end, element.clone())) + } + + fn move_leading_trivia( + &self, + token: &SyntaxToken, + end: usize, + element: SyntaxElement, + ) -> SyntaxElement { + let Some(pending) = self.pending_token(token).filter(|_| end > 0) else { return element }; + let mut moved: String = + pending.leading_trivia().take(end).map(|it| it.text().to_owned()).collect(); + if let Some(first) = element.first_non_trivia_token() { + moved.extend(first.leading_trivia().map(|it| it.text().to_owned())); + } + self.splice_leading_trivia(token, ..end, []); + self.with_trivia(&element, TriviaSide::Leading, &moved) + } + + fn covered_by(&self, range: TextRange, mut which: impl FnMut(&Change) -> bool) -> bool { + self.changes.borrow().iter().any(|change| { + let target = match change { + Change::Insert(..) | Change::InsertAll(..) => return false, + Change::Replace(target, _) | Change::ReplaceWithMany(target, _) => { + target.text_range() + } + Change::ReplaceAll(targets, _) => TextRange::new( + targets.start().text_range().start(), + targets.end().text_range().end(), + ), + }; + which(change) && target.contains_range(range) + }) + } + + fn surviving_token(&self, token: &SyntaxToken, direction: Direction) -> Option { + let step = |it: &SyntaxToken| match direction { + Direction::Next => it.next_non_trivia_token(), + Direction::Prev => it.prev_non_trivia_token(), + }; + + let mut current = step(token); + while let Some(it) = ¤t { + let deleted = self.covered_by(it.text_range(), |change| match change { + Change::Replace(_, replacement) => replacement.is_none(), + Change::ReplaceWithMany(_, new) | Change::ReplaceAll(_, new) => new.is_empty(), + Change::Insert(..) | Change::InsertAll(..) => false, + }); + if !deleted { + break; + } + current = step(it); } - self.insert_all(position, elements) + current + } + + fn make_room_at(&self, position: &Position, element: &SyntaxElement) { + let PositionRepr::After(anchor) = &position.repr else { return }; + let Some(token) = anchor.last_non_trivia_token() else { return }; + let Some(next) = token.next_non_trivia_token() else { return }; + if !is_ancestor_or_self_of_element(&SyntaxElement::Token(next.clone()), &self.root) { + return; + } + let inside_replacement = |range: TextRange| { + self.changes.borrow().iter().any(|change| match change { + Change::Replace(SyntaxElement::Node(target), _) + | Change::ReplaceWithMany(SyntaxElement::Node(target), _) => { + let target = target.text_range(); + target.contains_range(range) && target != range + } + _ => false, + }) + }; + if inside_replacement(token.text_range()) || inside_replacement(next.text_range()) { + return; + } + let Some(pending) = self.pending_token(&token) else { return }; + let len = pending.trailing_trivia().len(); + let line_comment = pending + .trailing_trivia() + .any(|it| it.kind() == SyntaxKind::COMMENT && it.text().starts_with("//")); + let starts_own_line = element + .first_non_trivia_token() + .and_then(|it| it.leading_trivia().next()) + .is_some_and(|it| it.kind() == SyntaxKind::NEWLINE); + let start = match line_comment && !starts_own_line { + true => 0, + false => crate::algo::outer_blank_trivia(&pending, TriviaSide::Trailing).start, + }; + if start == len || self.pending_token(&next).is_none() { + return; + } + let moved: Vec<_> = pending.trailing_trivia().skip(start).collect(); + self.splice_leading_trivia(&next, ..0, moved.iter().map(|it| (it.kind(), it.text()))); + self.splice_trailing_trivia(&token, start..len, []); + } + + pub fn insert_with_whitespace(&self, position: Position, element: impl Element) { + let mut element = element.syntax_element(); + if let Some(ws) = ws_before(&position, &element) { + element = self.with_trivia(&element, TriviaSide::Leading, &ws); + } + if let Some(ws) = ws_after(&position, &element) { + element = self.with_trivia(&element, TriviaSide::Trailing, &ws); + } + self.insert(position, element) } pub fn delete(&self, element: impl Element) { let element = element.syntax_element(); + debug_assert!(!element.is_trivia(), "trivia is not a structural delete target"); debug_assert!(is_ancestor_or_self_of_element(&element, &self.root)); debug_assert!( !matches!(&element, SyntaxElement::Node(node) if node == &self.root), "should not delete root node" ); let mut changes = self.changes.borrow_mut(); - for change in changes.iter_mut() { - if let Change::Replace(existing, replacement) = change - && *existing == element - { - if replacement.is_none() { - return; - } - *replacement = None; - return; - } + let queued = changes.iter_mut().find_map(|change| match change { + Change::Replace(existing, replacement) if *existing == element => Some(replacement), + _ => None, + }); + match queued { + Some(replacement) => *replacement = None, + None => changes.push(Change::Replace(element, None)), } - changes.push(Change::Replace(element, None)); } pub fn delete_all(&self, range: RangeInclusive) { + debug_assert!( + !range.start().is_trivia() && !range.end().is_trivia(), + "trivia is not a structural delete target" + ); if range.start() == range.end() { self.delete(range.start()); return; @@ -159,28 +403,233 @@ impl SyntaxEditor { pub fn replace(&self, old: impl Element, new: impl Element) { let old = old.syntax_element(); + let new = self.keep_edges(&old, &old, vec![new.syntax_element()]); + self.replace_verbatim(old, new.into_iter().next().expect("one replacement in, one out")); + } + + pub fn replace_verbatim(&self, old: impl Element, new: impl Element) { + let old = old.syntax_element(); + debug_assert!(!old.is_trivia(), "trivia is not a structural replace target"); debug_assert!(is_ancestor_or_self_of_element(&old, &self.root)); let new = new.syntax_element(); let mut changes = self.changes.borrow_mut(); - for change in changes.iter_mut() { - if let Change::Replace(existing, replacement) = change - && *existing == old - { - match replacement { - None => return, - Some(existing_new) if *existing_new == new => return, - Some(existing_new) => { - *existing_new = new; - return; - } - } + let queued = changes.iter_mut().find_map(|change| match change { + Change::Replace(existing, replacement) if *existing == old => Some(replacement), + _ => None, + }); + match queued { + Some(Some(existing)) => *existing = new, + Some(None) => (), + None => changes.push(Change::Replace(old, Some(new))), + } + } + + pub fn replace_token(&self, old: &SyntaxToken, new: &SyntaxToken) { + let Some(current) = self.pending_token(old) else { return }; + let green = current.green(); + let payload = token_payload( + new.kind(), + new.text(), + green.leading_trivia().to_vec(), + green.trailing_trivia().to_vec(), + ); + + self.transfer_annotations( + &SyntaxElement::Token(new.clone()), + &SyntaxElement::Token(payload.clone()), + ); + self.replace_verbatim(old, payload); + } + + pub fn splice_leading_trivia<'a>( + &self, + token: &SyntaxToken, + range: impl RangeBounds, + replacement: impl IntoIterator, + ) { + self.splice_trivia(token, TriviaSide::Leading, range, replacement); + } + + fn keep_edges( + &self, + start: &SyntaxElement, + end: &SyntaxElement, + mut new: Vec, + ) -> Vec { + if new.is_empty() || matches!(start, SyntaxElement::Node(node) if node == &self.root) { + return new; + } + + let leading: String = start + .first_non_trivia_token() + .and_then(|token| self.pending_token(&token)) + .map(|token| token.leading_trivia().map(|it| it.text().to_owned()).collect()) + .unwrap_or_default(); + if !leading.is_empty() + && let Some(first) = new[0].first_non_trivia_token() + && first.leading_trivia().next().is_none_or(|it| it.kind() == SyntaxKind::COMMENT) + { + let own: String = first.leading_trivia().map(|it| it.text().to_owned()).collect(); + new[0] = self.with_trivia(&new[0], TriviaSide::Leading, &format!("{leading}{own}")); + } + + let trailing: String = end + .last_non_trivia_token() + .and_then(|token| self.pending_token(&token)) + .map(|token| token.trailing_trivia().map(|it| it.text().to_owned()).collect()) + .unwrap_or_default(); + let index = new.len() - 1; + if !trailing.is_empty() + && new[index].last_non_trivia_token().is_some_and(|it| it.trailing_trivia().len() == 0) + { + new[index] = self.with_trivia(&new[index], TriviaSide::Trailing, &trailing); + } + + new + } + + fn delete_moving_trivia( + &self, + element: impl Element, + take: fn(&SyntaxToken, &SyntaxToken) -> String, + ) { + let element = element.syntax_element(); + if let (Some(first), Some(last)) = + (element.first_non_trivia_token(), element.last_non_trivia_token()) + && let Some(next) = self.surviving_token(&last, Direction::Next) + && is_ancestor_or_self_of_element(&SyntaxElement::Token(next.clone()), &self.root) + { + let moved = take(&first, &last); + if !moved.is_empty() { + self.prepend_leading_trivia(&next, &moved); } } - changes.push(Change::Replace(old, Some(new))); + self.delete(element); + } + + pub fn delete_keeping_edges(&self, element: impl Element) { + self.delete_moving_trivia(element, |first, last| { + first + .leading_trivia() + .chain(last.trailing_trivia()) + .map(|it| it.text().to_owned()) + .collect() + }); + } + + pub fn insert_taking_leading(&self, anchor: impl Element, element: impl Element) { + let anchor = anchor.syntax_element(); + let mut element = element.syntax_element(); + if let Some(first) = anchor.first_non_trivia_token() + && let Some(token) = self.pending_token(&first) + && token.leading_trivia().len() > 0 + { + let leading: String = token.leading_trivia().map(|it| it.text().to_owned()).collect(); + self.splice_leading_trivia(&first, .., []); + element = self.with_trivia(&element, TriviaSide::Leading, &leading); + } + self.insert(Position::before(anchor), element); + } + + pub fn delete_keeping_leading(&self, element: impl Element) { + self.delete_moving_trivia(element, |first, _| { + first.leading_trivia().map(|it| it.text().to_owned()).collect() + }); + } + + pub fn delete_keeping_lines(&self, element: impl Element) { + self.delete_moving_trivia(element, |first, _| { + let trivia: Vec<_> = first.leading_trivia().collect(); + match trivia.iter().rposition(|it| it.kind() == SyntaxKind::NEWLINE) { + Some(end) => trivia[..=end].iter().map(|it| it.text()).collect(), + None => String::new(), + } + }); + } + + pub fn strip_trailing_blank_trivia(&self, token: &SyntaxToken) { + let blank = crate::algo::outer_blank_trivia(token, TriviaSide::Trailing); + if !blank.is_empty() { + self.splice_trailing_trivia(token, blank, []); + } + } + + pub fn prepend_leading_trivia(&self, element: impl Element, text: &str) { + let Some(token) = element.syntax_element().first_non_trivia_token() else { return }; + self.splice_leading_trivia(&token, ..0, ast::make::tokens::trivia(text)); + } + + pub fn splice_trailing_trivia<'a>( + &self, + token: &SyntaxToken, + range: impl RangeBounds, + replacement: impl IntoIterator, + ) { + self.splice_trivia(token, TriviaSide::Trailing, range, replacement); + } + + fn splice_trivia<'a>( + &self, + token: &SyntaxToken, + side: TriviaSide, + range: impl RangeBounds, + replacement: impl IntoIterator, + ) { + let Some(current) = self.pending_token(token) else { return }; + let replacement = replacement.into_iter().collect::>(); + debug_assert!( + replacement.iter().all(|(kind, _)| kind.is_trivia()), + "a trivia token must have a trivia kind" + ); + + let rewritten = self.covered_by(token.text_range(), |change| { + matches!(change, Change::ReplaceWithMany(..) | Change::ReplaceAll(..)) + }); + if rewritten { + return; + } + + let green = current.green(); + let mut leading = green.leading_trivia().to_vec(); + let mut trailing = green.trailing_trivia().to_vec(); + let target = match side { + TriviaSide::Leading => &mut leading, + TriviaSide::Trailing => &mut trailing, + }; + + let replacement = replacement + .into_iter() + .map(|(kind, text)| rowan::GreenToken::new(rowan::SyntaxKind(kind.into()), text)); + target.splice(range, replacement).for_each(drop); + + debug_assert!( + trailing.iter().enumerate().all(|(index, it)| { + SyntaxKind::from(it.kind().0) != SyntaxKind::NEWLINE || index + 1 == trailing.len() + }), + "trailing trivia must end at the newline delimiter" + ); + + let payload = token_payload(current.kind(), current.text(), leading, trailing); + self.replace_verbatim(token, payload); + } + + pub fn pending_token(&self, token: &SyntaxToken) -> Option { + let element = SyntaxElement::Token(token.clone()); + let changes = self.changes.borrow(); + let queued = changes.iter().find_map(|change| match change { + Change::Replace(existing, replacement) if *existing == element => Some(replacement), + _ => None, + }); + match queued { + Some(replacement) => replacement.as_ref()?.as_token().cloned(), + None => Some(token.clone()), + } } pub fn replace_with_many(&self, old: impl Element, new: Vec) { let old = old.syntax_element(); + let new = self.keep_edges(&old, &old, new); + debug_assert!(!old.is_trivia(), "trivia is not a structural replace target"); debug_assert!(is_ancestor_or_self_of_element(&old, &self.root)); debug_assert!( !(matches!(&old, SyntaxElement::Node(node) if node == &self.root) && new.len() > 1), @@ -190,10 +639,15 @@ impl SyntaxEditor { } pub fn replace_all(&self, range: RangeInclusive, new: Vec) { + debug_assert!( + !range.start().is_trivia() && !range.end().is_trivia(), + "trivia is not a structural replace target" + ); if range.start() == range.end() { self.replace_with_many(range.start(), new); return; } + let new = self.keep_edges(range.start(), range.end(), new); debug_assert!(is_ancestor_or_self_of_element(range.start(), &self.root)); self.changes.borrow_mut().push(Change::ReplaceAll(range, new)) @@ -291,7 +745,12 @@ impl Position { pub(crate) fn place(&self) -> (SyntaxNode, usize) { match &self.repr { PositionRepr::FirstChild(parent) => (parent.clone(), 0), - PositionRepr::After(child) => (child.parent().unwrap(), child.index() + 1), + PositionRepr::After(child) | PositionRepr::LastChild(child) => { + (child.parent().unwrap(), child.index().expect("checked at insertion") + 1) + } + PositionRepr::Before(child) => { + (child.parent().unwrap(), child.index().expect("checked at insertion")) + } } } } @@ -300,32 +759,32 @@ impl Position { enum PositionRepr { FirstChild(SyntaxNode), After(SyntaxElement), + LastChild(SyntaxElement), + Before(SyntaxElement), } impl Position { pub fn after(elem: impl Element) -> Position { - let repr = PositionRepr::After(elem.syntax_element()); - Position { repr } + let elem = elem.syntax_element(); + debug_assert!(!elem.is_trivia(), "trivia is not a structural insertion anchor"); + Position { repr: PositionRepr::After(elem) } } pub fn before(elem: impl Element) -> Position { let elem = elem.syntax_element(); - let repr = match elem.prev_sibling_or_token() { - Some(it) => PositionRepr::After(it), - None => PositionRepr::FirstChild(elem.parent().unwrap()), - }; - Position { repr } + debug_assert!(!elem.is_trivia(), "trivia is not a structural insertion anchor"); + debug_assert!(elem.parent().is_some(), "a root is not an insertion anchor"); + Position { repr: PositionRepr::Before(elem) } } pub fn first_child_of(node: &(impl Into + Clone)) -> Position { - let repr = PositionRepr::FirstChild(node.clone().into()); - Position { repr } + Position { repr: PositionRepr::FirstChild(node.clone().into()) } } pub fn last_child_of(node: &(impl Into + Clone)) -> Position { let node = node.clone().into(); let repr = match node.last_child_or_token() { - Some(it) => PositionRepr::After(it), + Some(it) => PositionRepr::LastChild(it), None => PositionRepr::FirstChild(node), }; Position { repr } @@ -351,16 +810,23 @@ impl Change { fn target_range(&self) -> TextRange { match self { Change::Insert(target, _) | Change::InsertAll(target, _) => match &target.repr { - PositionRepr::FirstChild(parent) => TextRange::at( - parent.first_child_or_token().unwrap().text_range().start(), - 0.into(), - ), - PositionRepr::After(child) => TextRange::at(child.text_range().end(), 0.into()), + PositionRepr::FirstChild(parent) => { + TextRange::at(parent.text_range().start(), 0.into()) + } + PositionRepr::After(child) | PositionRepr::LastChild(child) => { + TextRange::at(child.text_range_including_trivia().end(), 0.into()) + } + PositionRepr::Before(child) => { + TextRange::at(child.text_range_including_trivia().start(), 0.into()) + } }, - Change::Replace(target, _) | Change::ReplaceWithMany(target, _) => target.text_range(), - Change::ReplaceAll(range, _) => { - range.start().text_range().cover(range.end().text_range()) + Change::Replace(target, _) | Change::ReplaceWithMany(target, _) => { + target.text_range_including_trivia() } + Change::ReplaceAll(range, _) => range + .start() + .text_range_including_trivia() + .cover(range.end().text_range_including_trivia()), } } @@ -429,14 +895,18 @@ impl fmt::Display for Change { Change::ReplaceAll(range, vec) => { let parent = range.start().parent().unwrap(); let parent_str = parent.to_string(); - let pre_range = - TextRange::new(parent.text_range().start(), range.start().text_range().start()); + let pre_range = TextRange::new( + parent.text_range().start(), + range.start().text_range_including_trivia().start(), + ); let old_range = TextRange::new( - range.start().text_range().start(), - range.end().text_range().end(), + range.start().text_range_including_trivia().start(), + range.end().text_range_including_trivia().end(), + ); + let post_range = TextRange::new( + range.end().text_range_including_trivia().end(), + parent.text_range().end(), ); - let post_range = - TextRange::new(range.end().text_range().end(), parent.text_range().end()); let pre_str = &parent_str[pre_range - parent.text_range().start()]; let old_str = &parent_str[old_range - parent.text_range().start()]; @@ -479,15 +949,13 @@ impl Element for SyntaxToken { } } -fn ws_before( - position: &Position, - new: &SyntaxElement, - factory: &SyntaxFactory, -) -> Option { +fn ws_before(position: &Position, new: &SyntaxElement) -> Option { let prev = match &position.repr { PositionRepr::FirstChild(_) => return None, - PositionRepr::After(it) => it, + PositionRepr::After(it) | PositionRepr::LastChild(it) => it.clone(), + PositionRepr::Before(it) => it.prev_sibling_or_token()?, }; + let prev = &prev; if prev.kind() == T!['{'] && new.kind() == SyntaxKind::USE @@ -495,7 +963,7 @@ fn ws_before( { let mut indent = IndentLevel::from_element(&item_list.syntax().clone().into()); indent.0 += 1; - return Some(factory.whitespace(&format!("\n{indent}"))); + return Some(format!("\n{indent}")); } if prev.kind() == T!['{'] @@ -504,33 +972,30 @@ fn ws_before( { let mut indent = IndentLevel::from_element(&stmt_list.syntax().clone().into()); indent.0 += 1; - return Some(factory.whitespace(&format!("\n{indent}"))); + return Some(format!("\n{indent}")); } - ws_between(prev, new, factory) + ws_between(prev, new) } -fn ws_after( - position: &Position, - new: &SyntaxElement, - factory: &SyntaxFactory, -) -> Option { +fn ws_after(position: &Position, new: &SyntaxElement) -> Option { let next = match &position.repr { PositionRepr::FirstChild(parent) => parent.first_child_or_token()?, - PositionRepr::After(sibling) => sibling.next_sibling_or_token()?, + PositionRepr::After(sibling) | PositionRepr::LastChild(sibling) => { + sibling.next_sibling_or_token()? + } + PositionRepr::Before(sibling) => sibling.clone(), }; - ws_between(new, &next, factory) + ws_between(new, &next) } -fn ws_between( - left: &SyntaxElement, - right: &SyntaxElement, - factory: &SyntaxFactory, -) -> Option { - if left.kind() == SyntaxKind::WHITESPACE || right.kind() == SyntaxKind::WHITESPACE { +fn ws_between(left: &SyntaxElement, right: &SyntaxElement) -> Option { + if left.last_non_trivia_token().is_some_and(|token| token.trailing_trivia().len() > 0) + || right.first_non_trivia_token().is_some_and(|token| token.leading_trivia().len() > 0) + { return None; } - if right.kind() == T![;] || right.kind() == T![,] { + if matches!(right.kind(), T![;] | T![,] | SyntaxKind::EOF) { return None; } if left.kind() == T![<] || right.kind() == T![>] { @@ -547,16 +1012,16 @@ fn ws_between( if left.kind() == SyntaxKind::USE { indent.0 = IndentLevel::from_element(right).0.max(indent.0); } - return Some(factory.whitespace(&format!("\n{indent}"))); + return Some(format!("\n{indent}")); } if left.kind() == SyntaxKind::ATTR { let mut indent = IndentLevel::from_element(right); if right.kind() == SyntaxKind::ATTR { indent.0 = IndentLevel::from_element(left).0.max(indent.0); } - return Some(factory.whitespace(&format!("\n{indent}"))); + return Some(format!("\n{indent}")); } - Some(factory.whitespace(" ")) + Some(" ".to_owned()) } fn is_ancestor_or_self(node: &SyntaxNode, ancestor: &SyntaxNode) -> bool { @@ -737,7 +1202,7 @@ mod tests { let expect = expect![[r#" { { - let first = 1;{ + let first = 1; { let second = 2;let third = 3; } } @@ -792,7 +1257,7 @@ mod tests { { { { - let first = 1;{ + let first = 1; { let second = 2; } } @@ -836,7 +1301,7 @@ mod tests { let expect = expect![[r#" { - let first = 1;{ + let first = 1; { let second = 2; } }"#]]; @@ -864,12 +1329,6 @@ mod tests { if let Some(ret_ty) = parent_fn.ret_type() { editor.delete(ret_ty.syntax().clone()); - - if let Some(SyntaxElement::Token(token)) = ret_ty.syntax().next_sibling_or_token() - && token.kind().is_trivia() - { - editor.delete(token); - } } if let Some(tail) = parent_fn.body().unwrap().tail_expr() { @@ -878,7 +1337,9 @@ mod tests { let edit = editor.finish(); - let expect = expect![["fn it() {\n \n}"]]; + let expect = expect![[r#" + fn it() { + }"#]]; expect.assert_eq(&edit.new_root.to_string()); } diff --git a/crates/syntax/src/syntax_editor/edit_algo.rs b/crates/syntax/src/syntax_editor/edit_algo.rs index 24e7016f5bde..dd84ce56dc0a 100644 --- a/crates/syntax/src/syntax_editor/edit_algo.rs +++ b/crates/syntax/src/syntax_editor/edit_algo.rs @@ -10,7 +10,7 @@ use crate::{NodeOrToken, SyntaxElement, SyntaxNode}; use super::{ Change, ChangeKind, PositionRepr, SyntaxAnnotation, SyntaxEdit, SyntaxEditor, SyntaxMapping, - mapping::MissingMapping, + TriviaSide, mapping::MissingMapping, }; /// A validated batch of changes in the exact order in which it must execute. @@ -89,20 +89,13 @@ impl EditPlan { .then(left.change_kind().cmp(&right.change_kind())) }); - if !Self::replacements_are_disjoint(&changes, &mut node_depth) { - return Err(InvalidEditPlan { changes }); - } - let mut entries = vec![PlanEntry::default(); changes.len()]; let mut regions_by_tree = FxHashMap::>::default(); for (index, change) in changes.iter().enumerate() { let target_tree = change.target_parent().tree_top(); let regions = regions_by_tree.entry(target_tree).or_default(); - if let Some(region_index) = regions - .iter() - .rposition(|region| region.range.contains_range(change.target_range())) - { + if let Some(region_index) = regions.iter().rposition(|region| region.contains(change)) { regions.truncate(region_index + 1); match regions[region_index].nested_changes { NestedChanges::Remap => { @@ -120,12 +113,37 @@ impl EditPlan { } } + if !Self::replacements_are_disjoint(&changes, &entries, &mut node_depth) { + return Err(InvalidEditPlan { changes }); + } + // Work from the innermost dependency towards the outermost one. This // lets a chain A -> B -> C rewrite C into B before B itself is mapped // into A's replacement tree. + let mut unmappable = Vec::new(); for (child, entry) in entries.iter().enumerate().rev() { - if let Some(parent) = entry.parent { - Self::rewrite_dependent_target(&mut changes, parent, child, mappings); + if let Some(parent) = entry.parent + && let Err(MissingMapping(missing)) = + Self::rewrite_dependent_target(&mut changes, parent, child, mappings) + { + assert!( + trivia_only(&changes[child]), + "no mappings exist between {missing:?} and the replacement of its ancestor: {}", + changes[child] + ); + unmappable.push(child); + } + } + for child in unmappable { + entries[child].discarded = true; + entries[child].parent = None; + } + for index in 0..entries.len() { + if let Some(parent) = entries[index].parent + && entries[parent].discarded + { + entries[index].discarded = true; + entries[index].parent = None; } } @@ -205,10 +223,14 @@ impl EditPlan { /// last range at that key, and `insert` can throw away the range it evicts. fn replacements_are_disjoint( changes: &[Change], + entries: &[PlanEntry], mut node_depth: impl FnMut(SyntaxNode) -> usize, ) -> bool { let mut previous = FxHashMap::<(SyntaxNode, usize), TextRange>::default(); - for change in changes { + for (change, entry) in changes.iter().zip(entries) { + if entry.discarded || entry.parent.is_some() { + continue; + } if !matches!(change.change_kind(), ChangeKind::Replace | ChangeKind::ReplaceRange) { continue; } @@ -231,7 +253,7 @@ impl EditPlan { parent: usize, child: usize, mappings: &SyntaxMapping, - ) { + ) -> Result<(), MissingMapping> { let (input_ancestor, output_ancestor) = match &changes[parent] { Change::Replace( SyntaxElement::Node(target), @@ -240,39 +262,32 @@ impl EditPlan { _ => unreachable!("only node replacements can own dependent changes"), }; - let upmap_node = |target: &SyntaxNode| { - mappings.upmap_child(target, &input_ancestor, &output_ancestor).unwrap_or_else( - |MissingMapping(current)| { - panic!( - "no mappings exist between {current:?} (ancestor of {input_ancestor:?}) and {output_ancestor:?}" - ) - }, - ) - }; let upmap_element = |target: &SyntaxElement| { - mappings.upmap_child_element(target, &input_ancestor, &output_ancestor).unwrap_or_else( - |MissingMapping(current)| { - panic!( - "no mappings exist between {current:?} (ancestor of {input_ancestor:?}) and {output_ancestor:?}" - ) - }, - ) + mappings.upmap_child_element(target, &input_ancestor, &output_ancestor) }; - match &mut changes[child] { Change::Insert(position, _) | Change::InsertAll(position, _) => { match &mut position.repr { - PositionRepr::FirstChild(parent) => *parent = upmap_node(parent), - PositionRepr::After(child) => *child = upmap_element(child), + PositionRepr::FirstChild(parent) => { + *parent = + mappings.upmap_child(parent, &input_ancestor, &output_ancestor)?; + } + PositionRepr::After(child) + | PositionRepr::LastChild(child) + | PositionRepr::Before(child) => { + *child = upmap_element(child)?; + } } } Change::Replace(target, _) | Change::ReplaceWithMany(target, _) => { - *target = upmap_element(target); + *target = upmap_element(target)?; } Change::ReplaceAll(range, _) => { - *range = upmap_element(range.start())..=upmap_element(range.end()); + let (start, end) = (upmap_element(range.start())?, upmap_element(range.end())?); + *range = start..=end; } } + Ok(()) } } @@ -289,7 +304,7 @@ impl SyntaxPath { let mut node = match element { SyntaxElement::Node(node) => node.clone(), SyntaxElement::Token(token) => { - child_indices.push(token.index()); + child_indices.push(token.index().expect("checked at editor entry")); token.parent().unwrap() } }; @@ -413,9 +428,27 @@ impl TreeState { /// Finds a change target in the current root. fn map_original_element(&self, element: &SyntaxElement) -> SyntaxElement { - self.map_original_path(SyntaxPath::new(element)) - .and_then(|path| path.resolve(&self.root)) - .expect("an edit target must still be present") + self.try_map_original_element(element).expect("an edit target must still be present") + } + + fn try_map_original_element(&self, element: &SyntaxElement) -> Option { + self.map_original_path(SyntaxPath::new(element)).and_then(|path| path.resolve(&self.root)) + } + + fn insertion_slot(&self, anchor: &SyntaxElement, after: bool) -> (SyntaxNode, usize) { + let mut current = Some(anchor.clone()); + while let Some(element) = current { + if !element.is_trivia() + && let Some(mapped) = self.try_map_original_element(&element) + { + let index = mapped.index().expect("checked at editor entry"); + let offset = usize::from(after || &element != anchor); + return (mapped.parent().unwrap(), index + offset); + } + current = element.prev_sibling_or_token(); + } + let parent = self.map_original_element(&anchor.parent().unwrap().into()); + (parent.into_node().unwrap(), 0) } /// Applies one child-list splice and updates tracked structural path. @@ -489,10 +522,10 @@ impl TreeState { let parent = self.map_original_element(&parent.clone().into()); (parent.into_node().unwrap(), 0) } - PositionRepr::After(child) => { - let child = self.map_original_element(child); - (child.parent().unwrap(), child.index() + 1) + PositionRepr::After(child) | PositionRepr::LastChild(child) => { + self.insertion_slot(child, true) } + PositionRepr::Before(child) => self.insertion_slot(child, false), }; self.splice( SyntaxPath::new(&parent.into()), @@ -507,7 +540,7 @@ impl TreeState { Change::Replace(target, _) | Change::ReplaceWithMany(target, _) => { let target = self.map_original_element(target); let parent = target.parent().unwrap(); - let index = target.index(); + let index = target.index().expect("checked at editor entry"); self.splice( SyntaxPath::new(&parent.into()), index..index + 1, @@ -521,7 +554,8 @@ impl TreeState { let parent = start.parent().unwrap(); self.splice( SyntaxPath::new(&parent.into()), - start.index()..end.index() + 1, + start.index().expect("checked at editor entry") + ..end.index().expect("checked at editor entry") + 1, replacement, record_as_changed, ); @@ -666,14 +700,17 @@ impl TreeStore { /// Plans and executes all changes recorded by a SyntaxEditor. pub(super) fn apply_edits(editor: SyntaxEditor) -> SyntaxEdit { + merge_swallowed_trivia(&editor); let SyntaxEditor { root, changes, annotations, make } = editor; + let changes = changes.into_inner(); + let annotations = annotations.into_inner(); let mappings = make.take(); let mut node_depths = FxHashMap::::default(); let mut node_depth = |node: SyntaxNode| { *node_depths.entry(node).or_insert_with_key(|node| node.ancestors().count()) }; - let plan = match EditPlan::build(changes.into_inner(), &mappings, &mut node_depth) { + let plan = match EditPlan::build(changes, &mappings, &mut node_depth) { Ok(plan) => plan, Err(InvalidEditPlan { changes }) => { report_intersecting_changes(&changes, &mut node_depth, &root); @@ -686,11 +723,84 @@ pub(super) fn apply_edits(editor: SyntaxEditor) -> SyntaxEdit { } }; - let mut trees = TreeStore::with_annotations(annotations.into_inner(), &mappings); + let mut trees = TreeStore::with_annotations(annotations, &mappings); trees.execute(plan); trees.finish(root) } +fn trivia_only(change: &Change) -> bool { + match change { + Change::Replace(SyntaxElement::Token(old), Some(SyntaxElement::Token(new))) => { + old.kind() == new.kind() && old.text() == new.text() + } + _ => false, + } +} + +fn merge_swallowed_trivia(editor: &SyntaxEditor) { + let mut changes = editor.changes.borrow_mut(); + let swallowing = changes + .iter() + .enumerate() + .filter(|(_, change)| { + matches!(change, Change::ReplaceWithMany(..) | Change::ReplaceAll(..)) + }) + .map(|(index, change)| (index, change.target_range())) + .collect::>(); + if swallowing.is_empty() { + return; + } + + let mut merges = Vec::new(); + let mut folded = vec![false; changes.len()]; + for (index, change) in changes.iter().enumerate() { + if !trivia_only(change) { + continue; + } + let range = change.target_range(); + let Some(&(owner, owner_range)) = + swallowing.iter().find(|(_, it)| it.contains_range(range)) + else { + continue; + }; + let Change::Replace(_, Some(SyntaxElement::Token(new))) = change else { continue }; + let leading: String = new.green().leading_trivia().iter().map(|it| it.text()).collect(); + let trailing: String = new.green().trailing_trivia().iter().map(|it| it.text()).collect(); + merges.push(( + owner, + range.start() == owner_range.start(), + range.end() == owner_range.end(), + leading, + trailing, + )); + folded[index] = true; + } + + for (owner, at_start, at_end, leading, trailing) in merges { + let payload = match &mut changes[owner] { + Change::ReplaceWithMany(_, new) | Change::ReplaceAll(_, new) => new, + _ => continue, + }; + if payload.is_empty() { + continue; + } + let last = payload.len() - 1; + if at_start { + payload[0] = editor.with_trivia(&payload[0], TriviaSide::Leading, &leading); + } + if at_end { + payload[last] = editor.with_trivia(&payload[last], TriviaSide::Trailing, &trailing); + } + } + + let mut index = 0; + changes.retain(|_| { + let keep = !folded[index]; + index += 1; + keep + }); +} + fn report_intersecting_changes( changes: &[Change], mut get_node_depth: impl FnMut(SyntaxNode) -> usize, @@ -766,6 +876,7 @@ fn report_intersecting_changes( /// A replacement region that can contain later source ordered changeds struct ChangedRegion { range: TextRange, + target: Option, change_index: usize, nested_changes: NestedChanges, } @@ -784,6 +895,7 @@ impl ChangedRegion { match change { Change::Replace(SyntaxElement::Node(target), replacement) => Some(Self { range: target.text_range(), + target: Some(target.clone()), change_index, nested_changes: if !discarded && matches!(replacement, Some(SyntaxElement::Node(_))) { @@ -794,18 +906,37 @@ impl ChangedRegion { }), Change::ReplaceWithMany(SyntaxElement::Node(target), _) => Some(Self { range: target.text_range(), + target: Some(target.clone()), change_index, nested_changes: NestedChanges::Discard, }), Change::ReplaceAll(elements, _) => Some(Self { range: TextRange::new( - elements.start().text_range().start(), - elements.end().text_range().end(), + elements.start().text_range_including_trivia().start(), + elements.end().text_range_including_trivia().end(), ), + target: None, change_index, nested_changes: NestedChanges::Discard, }), _ => None, } } + + fn contains(&self, change: &Change) -> bool { + let range = change.target_range(); + if !self.range.contains_range(range) { + return false; + } + match (&self.target, change) { + (Some(target), Change::Insert(position, _) | Change::InsertAll(position, _)) => { + super::is_ancestor_or_self(&position.parent(), target) + } + (None, Change::Insert(..) | Change::InsertAll(..)) => { + range.start() > self.range.start() && range.end() < self.range.end() + } + (Some(target), _) => super::is_ancestor_or_self(&change.target_parent(), target), + _ => true, + } + } } diff --git a/crates/syntax/src/syntax_editor/edits.rs b/crates/syntax/src/syntax_editor/edits.rs index 35e9b8d2f87d..39a915870b36 100644 --- a/crates/syntax/src/syntax_editor/edits.rs +++ b/crates/syntax/src/syntax_editor/edits.rs @@ -1,9 +1,9 @@ //! Structural editing for ast using `SyntaxEditor` use crate::{ - AstToken, Direction, SyntaxElement, SyntaxKind, SyntaxNode, SyntaxToken, T, + Direction, SyntaxElement, SyntaxKind, SyntaxNode, SyntaxToken, T, algo::neighbor, - ast::{self, AstNode, HasGenericParams, HasName, edit::IndentLevel}, + ast::{self, AstNode, HasGenericParams, HasName, edit::IndentLevel, make}, syntax_editor::{Position, SyntaxEditor}, }; @@ -24,10 +24,7 @@ pub trait GetOrCreateWhereClause: ast::HasGenericParams { if let Some(existing) = &existing { editor.replace(existing.syntax(), new_where.syntax()); } else if let Some(pos) = self.where_clause_position() { - editor.insert_all( - pos, - vec![make.whitespace(" ").into(), new_where.syntax().clone().into()], - ); + editor.insert(pos, make.with_leading_trivia(new_where.syntax(), " ")); } } } @@ -129,8 +126,7 @@ impl SyntaxEditor { if is_lifetime { if let Some(last_lt) = last_lifetime { let elements = vec![ - make.token(SyntaxKind::COMMA).into(), - make.token(SyntaxKind::WHITESPACE).into(), + make.with_trailing_trivia(make.token(T![,]), " "), new_param.syntax().clone().into(), ]; self.insert_all(Position::after(last_lt.syntax()), elements); @@ -138,16 +134,14 @@ impl SyntaxEditor { // Insert before the first parameter let elements = vec![ new_param.syntax().clone().into(), - make.token(SyntaxKind::COMMA).into(), - make.token(SyntaxKind::WHITESPACE).into(), + make.with_trailing_trivia(make.token(T![,]), " "), ]; self.insert_all(Position::before(first_param.syntax()), elements); } } else { let last_param = generic_param_list.generic_params().last().unwrap(); let elements = vec![ - make.token(SyntaxKind::COMMA).into(), - make.token(SyntaxKind::WHITESPACE).into(), + make.with_trailing_trivia(make.token(T![,]), " "), new_param.syntax().clone().into(), ]; self.insert_all(Position::after(last_param.syntax()), elements); @@ -226,12 +220,10 @@ impl ast::AssocItemList { let elements: Vec = items .into_iter() .enumerate() - .flat_map(|(i, item)| { + .map(|(i, item)| { let whitespace = if i != 0 { "\n\n" } else { whitespace }; - vec![ - make.whitespace(&format!("{whitespace}{indent}")).into(), - item.syntax().clone().into(), - ] + let item = make.with_trailing_trivia(item.syntax(), ""); + make.with_leading_trivia(item, &format!("{whitespace}{indent}")) }) .collect(); editor.insert_all(position, elements); @@ -283,14 +275,10 @@ fn add_record_fields( } let make = editor.make(); - let is_multiline = field_list.text().contains_char('\n'); - let whitespace = || { - if is_multiline { - let indent = IndentLevel::from_node(field_list) + 1; - make.whitespace(&format!("\n{indent}")) - } else { - make.whitespace(" ") - } + let is_multiline = field_list.text_without_outer_trivia().contains_char('\n'); + let separator = match is_multiline { + true => format!("\n{}", IndentLevel::from_node(field_list) + 1), + false => " ".to_owned(), }; if is_multiline { @@ -325,14 +313,16 @@ fn add_record_fields( let fields_len = fields.len(); for (idx, field) in fields.into_iter().enumerate() { - elements.push(whitespace().into()); - elements.push(field); + elements.push(make.with_leading_trivia(&field, &separator)); if is_multiline || idx + 1 != fields_len { elements.push(make.token(T![,]).into()); } } - if !is_multiline && next_after_insert.is_some_and(|it| it.kind() != SyntaxKind::WHITESPACE) { - elements.push(make.whitespace(" ").into()); + if !is_multiline + && next_after_insert.is_some_and(|it| it.trivia_before().next().is_none()) + && let Some(last) = elements.pop() + { + elements.push(make.with_trailing_trivia(&last, " ")); } editor.insert_all(position, elements); @@ -355,9 +345,9 @@ impl ast::Impl { list } else { let list = make.assoc_item_list_empty(); - editor.insert_all( + editor.insert( Position::last_child_of(self.syntax()), - vec![make.whitespace(" ").into(), list.syntax().clone().into()], + make.with_leading_trivia(list.syntax(), " "), ); list } @@ -380,9 +370,8 @@ impl ast::VariantList { None => (IndentLevel::zero(), Position::last_child_of(self.syntax())), }, }; - let elements: Vec = vec![ - make.whitespace(&format!("{}{indent}", "\n")).into(), - variant.syntax().clone().into(), + let elements = vec![ + make.with_leading_trivia(variant.syntax(), &format!("\n{indent}")), make.token(T![,]).into(), ]; editor.insert_all(position, elements); @@ -395,20 +384,21 @@ impl ast::Fn { if let Some(old_body) = self.body() { editor.replace(old_body.syntax(), body.syntax()); } else { - let single_space = make.whitespace(" "); - let elements = vec![single_space.into(), body.syntax().clone().into()]; - - if let Some(semicolon) = self.semicolon_token() { - editor.replace_with_many(semicolon, elements); - } else { - editor.insert_all(Position::last_child_of(self.syntax()), elements); + let body = make.with_leading_trivia(body.syntax(), " "); + match self.semicolon_token() { + Some(semicolon) => editor.replace(semicolon, body), + None => { + if let Some(last) = self.syntax().last_non_trivia_token() { + editor.splice_trailing_trivia(&last, .., []); + } + editor.insert(Position::last_child_of(self.syntax()), body); + } } } } } fn normalize_ws_between_braces(editor: &SyntaxEditor, node: &SyntaxNode) -> Option<()> { - let make = editor.make(); let l = node .children_with_tokens() .filter_map(|it| it.into_token()) @@ -418,20 +408,19 @@ fn normalize_ws_between_braces(editor: &SyntaxEditor, node: &SyntaxNode) -> Opti .filter_map(|it| it.into_token()) .find(|it| it.kind() == T!['}'])?; - let indent = IndentLevel::from_node(node); + if l.next_sibling_or_token()?.into_token()? != r { + return Some(()); + } - match l.next_sibling_or_token() { - Some(ws) - if ws.kind() == SyntaxKind::WHITESPACE - && ws.next_sibling_or_token()?.into_token()? == r => - { - editor.replace(ws, make.whitespace(&format!("\n{indent}"))); - } - Some(ws) if ws.kind() == T!['}'] => { - editor.insert(Position::after(l), make.whitespace(&format!("\n{indent}"))); - } - _ => (), + if r.green().leading_trivia().iter().any(|it| { + !matches!(SyntaxKind::from(it.kind().0), SyntaxKind::WHITESPACE | SyntaxKind::NEWLINE) + }) { + return Some(()); } + + let indent = IndentLevel::from_node(node).to_string(); + editor.splice_trailing_trivia(&l, .., [(SyntaxKind::NEWLINE, "\n")]); + editor.splice_leading_trivia(&r, .., make::tokens::trivia(&indent)); Some(()) } @@ -450,46 +439,7 @@ impl Removable for ast::TypeBoundList { impl Removable for ast::Use { fn remove(&self, editor: &SyntaxEditor) { - let make = editor.make(); - let next_ws = self - .syntax() - .next_sibling_or_token() - .and_then(|it| it.into_token()) - .and_then(ast::Whitespace::cast); - if let Some(next_ws) = next_ws { - let ws_text = next_ws.syntax().text(); - if let Some(rest) = ws_text.strip_prefix('\n') { - let next_use_removed = next_ws - .syntax() - .next_sibling_or_token() - .and_then(|it| it.into_node()) - .and_then(ast::Use::cast) - .and_then(|use_| use_.use_tree()) - .is_some_and(|use_tree| editor.deleted(use_tree.syntax())); - if rest.is_empty() || next_use_removed { - editor.delete(next_ws.syntax()); - } else { - editor.replace(next_ws.syntax(), make.whitespace(rest)); - } - } - } - let prev_ws = self - .syntax() - .prev_sibling_or_token() - .and_then(|it| it.into_token()) - .and_then(ast::Whitespace::cast); - if let Some(prev_ws) = prev_ws { - let ws_text = prev_ws.syntax().text(); - let prev_newline = ws_text.rfind('\n').map(|x| x + 1).unwrap_or(0); - let rest = &ws_text[0..prev_newline]; - if rest.is_empty() { - editor.delete(prev_ws.syntax()); - } else { - editor.replace(prev_ws.syntax(), make.whitespace(rest)); - } - } - - editor.delete(self.syntax()); + editor.delete_keeping_lines(self.syntax()); } } diff --git a/crates/syntax/src/syntax_editor/mapping.rs b/crates/syntax/src/syntax_editor/mapping.rs index 17319368afc3..2049817b8a7f 100644 --- a/crates/syntax/src/syntax_editor/mapping.rs +++ b/crates/syntax/src/syntax_editor/mapping.rs @@ -35,11 +35,12 @@ impl SyntaxMapping { let upmap_parent = self.upmap_child(&token.parent().unwrap(), input_ancestor, output_ancestor)?; - let element = upmap_parent.children_with_tokens().nth(token.index()).unwrap(); - debug_assert!( - element.as_token().is_some_and(|it| it.kind() == token.kind()), - "token upmapping mapped to the wrong node ({token:?} -> {element:?})" - ); + let index = token.index().ok_or_else(|| MissingMapping(upmap_parent.clone()))?; + let element = upmap_parent + .children_with_tokens() + .nth(index) + .filter(|it| it.as_token().is_some_and(|it| it.kind() == token.kind())) + .ok_or(MissingMapping(upmap_parent))?; Ok(element) } @@ -106,11 +107,17 @@ impl SyntaxMapping { input_ancestor: &SyntaxNode, output_ancestor: &SyntaxNode, ) -> Result, MissingMapping> { - let mut current = - self.upmap_node_single(input_ancestor).unwrap_or_else(|| input_ancestor.clone()); - let mut upmap_chain = vec![current.index()]; + let mut current = self + .upmap_node_single(input_ancestor) + .ok_or_else(|| MissingMapping(input_ancestor.clone()))?; + let mut upmap_chain = Vec::new(); loop { + if ¤t == output_ancestor { + return Ok(upmap_chain); + } + upmap_chain.push(current.index()); + let Some(parent) = current.parent() else { break }; if &parent == output_ancestor { @@ -121,7 +128,6 @@ impl SyntaxMapping { Some(next) => next, None => parent, }; - upmap_chain.push(current.index()); } Err(MissingMapping(current)) @@ -156,18 +162,25 @@ impl SyntaxMapping { })); } - /// Follows the input one step along the syntax mapping tree + /// Follows the input along the syntax mapping tree to its final output, bounded by + /// the number of recorded mappings so a cycle cannot spin forever fn upmap_node_single(&self, input: &SyntaxNode) -> Option { - let MappingEntry { parent, child_slot } = self.node_mappings.get(input)?; - - let output = self.entry_parents[*parent as usize] - .children_with_tokens() - .nth(*child_slot as usize) - .and_then(SyntaxElement::into_node) - .unwrap(); + let mut current = input.clone(); + let mut output = None; + for _ in 0..=self.node_mappings.len() { + let Some(MappingEntry { parent, child_slot }) = self.node_mappings.get(¤t) else { + break; + }; + current = self.entry_parents[*parent as usize] + .children_with_tokens() + .nth(*child_slot as usize) + .and_then(SyntaxElement::into_node) + .unwrap(); + output = Some(current.clone()); + } - debug_assert_eq!(input.kind(), output.kind()); - Some(output) + debug_assert!(output.as_ref().is_none_or(|output| input.kind() == output.kind())); + output } pub fn add_mapping(&mut self, syntax_mapping: SyntaxMappingBuilder) { @@ -197,6 +210,9 @@ impl SyntaxMappingBuilder { pub fn map_node(&mut self, input: SyntaxNode, output: SyntaxNode) { debug_assert_eq!(output.parent().as_ref(), Some(&self.parent_node)); + if input == output { + return; + } self.node_mappings.push((input, output.index() as u32)); } diff --git a/crates/syntax/src/syntax_node.rs b/crates/syntax/src/syntax_node.rs index 2e9e0bc226b9..7a6872990d68 100644 --- a/crates/syntax/src/syntax_node.rs +++ b/crates/syntax/src/syntax_node.rs @@ -10,7 +10,7 @@ use rowan::{GreenNodeBuilder, Language}; use crate::{Parse, SyntaxError, SyntaxKind, TextSize}; -pub(crate) use rowan::{GreenNode, GreenToken, NodeOrToken}; +pub(crate) use rowan::{GreenNode, NodeOrToken}; #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum RustLanguage {} @@ -33,6 +33,21 @@ pub type SyntaxNodeChildren = rowan::SyntaxNodeChildren; pub type SyntaxElementChildren = rowan::SyntaxElementChildren; pub type PreorderWithTokens = rowan::api::PreorderWithTokens; +pub(crate) fn token_payload( + kind: SyntaxKind, + text: &str, + leading: Vec, + trailing: Vec, +) -> SyntaxToken { + let token = + rowan::GreenToken::with_trivia(RustLanguage::kind_to_raw(kind), text, leading, trailing); + let root = SyntaxNode::new_root(GreenNode::new( + RustLanguage::kind_to_raw(SyntaxKind::ERROR), + [NodeOrToken::Token(token)], + )); + root.first_non_trivia_token().expect("the root was given a token") +} + #[derive(Default)] pub struct SyntaxTreeBuilder { errors: Vec, @@ -61,6 +76,21 @@ impl SyntaxTreeBuilder { self.inner.token(kind, text); } + pub fn token_with_trivia( + &mut self, + kind: SyntaxKind, + text: &str, + leading: &[parser::Trivia<'_>], + trailing: &[parser::Trivia<'_>], + ) { + self.inner.token_with_trivia( + RustLanguage::kind_to_raw(kind), + text, + leading.iter().map(|it| (RustLanguage::kind_to_raw(it.kind), it.text)), + trailing.iter().map(|it| (RustLanguage::kind_to_raw(it.kind), it.text)), + ); + } + pub fn start_node(&mut self, kind: SyntaxKind) { let kind = RustLanguage::kind_to_raw(kind); self.inner.start_node(kind); diff --git a/crates/syntax/src/validation.rs b/crates/syntax/src/validation.rs index acc5d705cfa2..986a77571e1e 100644 --- a/crates/syntax/src/validation.rs +++ b/crates/syntax/src/validation.rs @@ -5,7 +5,6 @@ mod block; use itertools::Itertools; -use rowan::Direction; use rustc_literal_escaper::{ EscapeError, unescape_byte, unescape_byte_str, unescape_c_str, unescape_char, unescape_str, }; @@ -13,7 +12,7 @@ use rustc_literal_escaper::{ use crate::{ AstNode, SyntaxError, SyntaxKind::{CONST, FN, INT_NUMBER, TYPE_ALIAS}, - SyntaxNode, SyntaxToken, T, TextSize, algo, + SyntaxNode, SyntaxToken, T, TextSize, ast::{self, HasAttrs, HasVisibility, IsString, RangeItem}, match_ast, }; @@ -251,7 +250,10 @@ fn validate_visibility(vis: ast::Visibility, errors: &mut Vec) { false }; if path_without_in_token { - errors.push(SyntaxError::new("incorrect visibility restriction", vis.syntax.text_range())); + errors.push(SyntaxError::new( + "incorrect visibility restriction", + vis.syntax.text_range_without_outer_trivia(), + )); } let parent = match vis.syntax().parent() { Some(it) => it, @@ -269,7 +271,10 @@ fn validate_visibility(vis: ast::Visibility, errors: &mut Vec) { // FIXME: disable validation if there's an attribute, since some proc macros use this syntax. // ideally the validation would run only on the fully expanded code, then this wouldn't be necessary. if impl_def.trait_().is_some() && impl_def.attrs().next().is_none() { - errors.push(SyntaxError::new("Unnecessary visibility qualifier", vis.syntax.text_range())); + errors.push(SyntaxError::new( + "Unnecessary visibility qualifier", + vis.syntax.text_range_without_outer_trivia(), + )); } } @@ -277,7 +282,7 @@ fn validate_range_expr(expr: ast::RangeExpr, errors: &mut Vec) { if expr.op_kind() == Some(ast::RangeOp::Inclusive) && expr.end().is_none() { errors.push(SyntaxError::new( "An inclusive range must have an end expression", - expr.syntax().text_range(), + expr.syntax().text_range_without_outer_trivia(), )); } } @@ -378,7 +383,7 @@ fn validate_trait_object_ty(ty: ast::DynTraitType) -> Option { match no_bounds { true => Some(SyntaxError::new( "At least one trait is required for an object type", - ty.syntax().text_range(), + ty.syntax().text_range_without_outer_trivia(), )), false => None, } @@ -391,7 +396,7 @@ fn validate_impl_object_ty(ty: ast::ImplTraitType) -> Option { match no_bounds { true => Some(SyntaxError::new( "At least one trait is required for an object type", - ty.syntax().text_range(), + ty.syntax().text_range_without_outer_trivia(), )), false => None, } @@ -400,12 +405,15 @@ fn validate_impl_object_ty(ty: ast::ImplTraitType) -> Option { // FIXME: This is not a validation error, this is a context dependent parse error fn validate_trait_object_ty_plus(ty: ast::DynTraitType) -> Option { let dyn_token = ty.dyn_token()?; - let preceding_token = algo::skip_trivia_token(dyn_token.prev_token()?, Direction::Prev)?; + let preceding_token = dyn_token.prev_non_trivia_token()?; let tbl = ty.type_bound_list()?; let more_than_one_bound = tbl.bounds().next_tuple::<(_, _)>().is_some(); if more_than_one_bound && !matches!(preceding_token.kind(), T!['('] | T![<] | T![=]) { - Some(SyntaxError::new("ambiguous `+` in a type", ty.syntax().text_range())) + Some(SyntaxError::new( + "ambiguous `+` in a type", + ty.syntax().text_range_without_outer_trivia(), + )) } else { None } @@ -414,12 +422,15 @@ fn validate_trait_object_ty_plus(ty: ast::DynTraitType) -> Option { // FIXME: This is not a validation error, this is a context dependent parse error fn validate_impl_object_ty_plus(ty: ast::ImplTraitType) -> Option { let dyn_token = ty.impl_token()?; - let preceding_token = algo::skip_trivia_token(dyn_token.prev_token()?, Direction::Prev)?; + let preceding_token = dyn_token.prev_non_trivia_token()?; let tbl = ty.type_bound_list()?; let more_than_one_bound = tbl.bounds().next_tuple::<(_, _)>().is_some(); if more_than_one_bound && !matches!(preceding_token.kind(), T!['('] | T![<] | T![=]) { - Some(SyntaxError::new("ambiguous `+` in a type", ty.syntax().text_range())) + Some(SyntaxError::new( + "ambiguous `+` in a type", + ty.syntax().text_range_without_outer_trivia(), + )) } else { None } @@ -429,17 +440,14 @@ fn validate_macro_rules(mac: ast::MacroRules, errors: &mut Vec) { if let Some(vis) = mac.visibility() { errors.push(SyntaxError::new( "visibilities are not allowed on `macro_rules!` items", - vis.syntax().text_range(), + vis.syntax().text_range_without_outer_trivia(), )); } } fn validate_const(const_: ast::Const, errors: &mut Vec) { - if let Some(mut_token) = const_ - .const_token() - .and_then(|t| t.next_token()) - .and_then(|t| algo::skip_trivia_token(t, Direction::Next)) - .filter(|t| t.kind() == T![mut]) + if let Some(mut_token) = + const_.const_token().and_then(|t| t.next_non_trivia_token()).filter(|t| t.kind() == T![mut]) { errors.push(SyntaxError::new("const globals cannot be mutable", mut_token.text_range())); } @@ -471,6 +479,6 @@ fn validate_let_expr(let_: ast::LetExpr, errors: &mut Vec) { } errors.push(SyntaxError::new( "`let` expressions are not supported here", - let_.syntax().text_range(), + let_.syntax().text_range_without_outer_trivia(), )); } diff --git a/crates/syntax/src/validation/block.rs b/crates/syntax/src/validation/block.rs index 00d87ba0e687..4170bf3d3994 100644 --- a/crates/syntax/src/validation/block.rs +++ b/crates/syntax/src/validation/block.rs @@ -20,7 +20,7 @@ pub(crate) fn validate_block_expr(block: ast::BlockExpr, errors: &mut Vec" - WHITESPACE@12..13 " " - EQ@13..14 "=" - WHITESPACE@14..15 " " + R_ANGLE@11..12 ">" [] [WHITESPACE(" ")] + EQ@13..14 "=" [] [WHITESPACE(" ")] REF_TYPE@15..34 AMP@15..16 "&" - LIFETIME@16..18 - LIFETIME_IDENT@16..18 "'a" - WHITESPACE@18..19 " " + LIFETIME@16..19 + LIFETIME_IDENT@16..18 "'a" [] [WHITESPACE(" ")] DYN_TRAIT_TYPE@19..34 - DYN_KW@19..22 "dyn" - WHITESPACE@22..23 " " + DYN_KW@19..22 "dyn" [] [WHITESPACE(" ")] TYPE_BOUND_LIST@23..34 - TYPE_BOUND@23..27 - PATH_TYPE@23..27 - PATH@23..27 - PATH_SEGMENT@23..27 - NAME_REF@23..27 - IDENT@23..27 "Send" - WHITESPACE@27..28 " " - PLUS@28..29 "+" - WHITESPACE@29..30 " " + TYPE_BOUND@23..28 + PATH_TYPE@23..28 + PATH@23..28 + PATH_SEGMENT@23..28 + NAME_REF@23..28 + IDENT@23..27 "Send" [] [WHITESPACE(" ")] + PLUS@28..29 "+" [] [WHITESPACE(" ")] TYPE_BOUND@30..34 PATH_TYPE@30..34 PATH@30..34 PATH_SEGMENT@30..34 NAME_REF@30..34 IDENT@30..34 "Sync" - SEMICOLON@34..35 ";" - WHITESPACE@35..36 "\n" - TYPE_ALIAS@36..70 - TYPE_KW@36..40 "type" - WHITESPACE@40..41 " " - NAME@41..44 - IDENT@41..44 "Foo" - WHITESPACE@44..45 " " - EQ@45..46 "=" - WHITESPACE@46..47 " " + SEMICOLON@34..35 ";" [] [NEWLINE("\n")] + TYPE_ALIAS@36..71 + TYPE_KW@36..40 "type" [] [WHITESPACE(" ")] + NAME@41..45 + IDENT@41..44 "Foo" [] [WHITESPACE(" ")] + EQ@45..46 "=" [] [WHITESPACE(" ")] PTR_TYPE@47..69 STAR@47..48 "*" - CONST_KW@48..53 "const" - WHITESPACE@53..54 " " + CONST_KW@48..53 "const" [] [WHITESPACE(" ")] DYN_TRAIT_TYPE@54..69 - DYN_KW@54..57 "dyn" - WHITESPACE@57..58 " " + DYN_KW@54..57 "dyn" [] [WHITESPACE(" ")] TYPE_BOUND_LIST@58..69 - TYPE_BOUND@58..62 - PATH_TYPE@58..62 - PATH@58..62 - PATH_SEGMENT@58..62 - NAME_REF@58..62 - IDENT@58..62 "Send" - WHITESPACE@62..63 " " - PLUS@63..64 "+" - WHITESPACE@64..65 " " + TYPE_BOUND@58..63 + PATH_TYPE@58..63 + PATH@58..63 + PATH_SEGMENT@58..63 + NAME_REF@58..63 + IDENT@58..62 "Send" [] [WHITESPACE(" ")] + PLUS@63..64 "+" [] [WHITESPACE(" ")] TYPE_BOUND@65..69 PATH_TYPE@65..69 PATH@65..69 PATH_SEGMENT@65..69 NAME_REF@65..69 IDENT@65..69 "Sync" - SEMICOLON@69..70 ";" - WHITESPACE@70..71 "\n" - TYPE_ALIAS@71..109 - TYPE_KW@71..75 "type" - WHITESPACE@75..76 " " - NAME@76..79 - IDENT@76..79 "Foo" - WHITESPACE@79..80 " " - EQ@80..81 "=" - WHITESPACE@81..82 " " + SEMICOLON@69..70 ";" [] [NEWLINE("\n")] + TYPE_ALIAS@71..110 + TYPE_KW@71..75 "type" [] [WHITESPACE(" ")] + NAME@76..80 + IDENT@76..79 "Foo" [] [WHITESPACE(" ")] + EQ@80..81 "=" [] [WHITESPACE(" ")] FN_PTR_TYPE@82..108 FN_KW@82..84 "fn" - PARAM_LIST@84..86 + PARAM_LIST@84..87 L_PAREN@84..85 "(" - R_PAREN@85..86 ")" - WHITESPACE@86..87 " " + R_PAREN@85..86 ")" [] [WHITESPACE(" ")] RET_TYPE@87..108 - THIN_ARROW@87..89 "->" - WHITESPACE@89..90 " " + THIN_ARROW@87..89 "->" [] [WHITESPACE(" ")] DYN_TRAIT_TYPE@90..108 - DYN_KW@90..93 "dyn" - WHITESPACE@93..94 " " + DYN_KW@90..93 "dyn" [] [WHITESPACE(" ")] TYPE_BOUND_LIST@94..108 - TYPE_BOUND@94..98 - PATH_TYPE@94..98 - PATH@94..98 - PATH_SEGMENT@94..98 - NAME_REF@94..98 - IDENT@94..98 "Send" - WHITESPACE@98..99 " " - PLUS@99..100 "+" - WHITESPACE@100..101 " " + TYPE_BOUND@94..99 + PATH_TYPE@94..99 + PATH@94..99 + PATH_SEGMENT@94..99 + NAME_REF@94..99 + IDENT@94..98 "Send" [] [WHITESPACE(" ")] + PLUS@99..100 "+" [] [WHITESPACE(" ")] TYPE_BOUND@101..108 LIFETIME@101..108 LIFETIME_IDENT@101..108 "'static" - SEMICOLON@108..109 ";" - WHITESPACE@109..110 "\n" - FN@110..186 - FN_KW@110..112 "fn" - WHITESPACE@112..113 " " + SEMICOLON@108..109 ";" [] [NEWLINE("\n")] + FN@110..187 + FN_KW@110..112 "fn" [] [WHITESPACE(" ")] NAME@113..117 IDENT@113..117 "main" - PARAM_LIST@117..119 + PARAM_LIST@117..120 L_PAREN@117..118 "(" - R_PAREN@118..119 ")" - WHITESPACE@119..120 " " - BLOCK_EXPR@120..186 - STMT_LIST@120..186 - L_CURLY@120..121 "{" - WHITESPACE@121..126 "\n " - LET_STMT@126..184 - LET_KW@126..129 "let" - WHITESPACE@129..130 " " - IDENT_PAT@130..131 - NAME@130..131 - IDENT@130..131 "b" - WHITESPACE@131..132 " " - EQ@132..133 "=" - WHITESPACE@133..134 " " + R_PAREN@118..119 ")" [] [WHITESPACE(" ")] + BLOCK_EXPR@120..187 + STMT_LIST@120..187 + L_CURLY@120..121 "{" [] [NEWLINE("\n")] + LET_STMT@122..185 + LET_KW@126..129 "let" [WHITESPACE(" ")] [WHITESPACE(" ")] + IDENT_PAT@130..132 + NAME@130..132 + IDENT@130..131 "b" [] [WHITESPACE(" ")] + EQ@132..133 "=" [] [WHITESPACE(" ")] CAST_EXPR@134..183 - PAREN_EXPR@134..138 + PAREN_EXPR@134..139 L_PAREN@134..135 "(" REF_EXPR@135..137 AMP@135..136 "&" @@ -139,23 +108,20 @@ SOURCE_FILE@0..187 PATH_SEGMENT@136..137 NAME_REF@136..137 IDENT@136..137 "a" - R_PAREN@137..138 ")" - WHITESPACE@138..139 " " - AS_KW@139..141 "as" - WHITESPACE@141..142 " " + R_PAREN@137..138 ")" [] [WHITESPACE(" ")] + AS_KW@139..141 "as" [] [WHITESPACE(" ")] REF_TYPE@142..183 AMP@142..143 "&" DYN_TRAIT_TYPE@143..183 - DYN_KW@143..146 "dyn" - WHITESPACE@146..147 " " + DYN_KW@143..146 "dyn" [] [WHITESPACE(" ")] TYPE_BOUND_LIST@147..183 - TYPE_BOUND@147..175 - PATH_TYPE@147..175 - PATH@147..175 - PATH_SEGMENT@147..175 + TYPE_BOUND@147..176 + PATH_TYPE@147..176 + PATH@147..176 + PATH_SEGMENT@147..176 NAME_REF@147..150 IDENT@147..150 "Add" - GENERIC_ARG_LIST@150..175 + GENERIC_ARG_LIST@150..176 L_ANGLE@150..151 "<" TYPE_ARG@151..156 PATH_TYPE@151..156 @@ -163,33 +129,27 @@ SOURCE_FILE@0..187 PATH_SEGMENT@151..156 NAME_REF@151..156 IDENT@151..156 "Other" - COMMA@156..157 "," - WHITESPACE@157..158 " " + COMMA@156..157 "," [] [WHITESPACE(" ")] ASSOC_TYPE_ARG@158..174 - NAME_REF@158..164 - IDENT@158..164 "Output" - WHITESPACE@164..165 " " - EQ@165..166 "=" - WHITESPACE@166..167 " " + NAME_REF@158..165 + IDENT@158..164 "Output" [] [WHITESPACE(" ")] + EQ@165..166 "=" [] [WHITESPACE(" ")] PATH_TYPE@167..174 PATH@167..174 PATH_SEGMENT@167..174 NAME_REF@167..174 IDENT@167..174 "Addable" - R_ANGLE@174..175 ">" - WHITESPACE@175..176 " " - PLUS@176..177 "+" - WHITESPACE@177..178 " " + R_ANGLE@174..175 ">" [] [WHITESPACE(" ")] + PLUS@176..177 "+" [] [WHITESPACE(" ")] TYPE_BOUND@178..183 PATH_TYPE@178..183 PATH@178..183 PATH_SEGMENT@178..183 NAME_REF@178..183 IDENT@178..183 "Other" - SEMICOLON@183..184 ";" - WHITESPACE@184..185 "\n" - R_CURLY@185..186 "}" - WHITESPACE@186..187 "\n" + SEMICOLON@183..184 ";" [] [NEWLINE("\n")] + R_CURLY@185..186 "}" [] [NEWLINE("\n")] + EOF@187..187 "" error 19..34: ambiguous `+` in a type error 54..69: ambiguous `+` in a type error 90..108: ambiguous `+` in a type diff --git a/crates/syntax/test_data/parser/validation/0046_mutable_const_item.rast b/crates/syntax/test_data/parser/validation/0046_mutable_const_item.rast index c7eb312c92c2..57481d68d60c 100644 --- a/crates/syntax/test_data/parser/validation/0046_mutable_const_item.rast +++ b/crates/syntax/test_data/parser/validation/0046_mutable_const_item.rast @@ -1,22 +1,17 @@ SOURCE_FILE@0..24 - CONST@0..23 - CONST_KW@0..5 "const" - WHITESPACE@5..6 " " - MUT_KW@6..9 "mut" - WHITESPACE@9..10 " " + CONST@0..24 + CONST_KW@0..5 "const" [] [WHITESPACE(" ")] + MUT_KW@6..9 "mut" [] [WHITESPACE(" ")] NAME@10..13 IDENT@10..13 "FOO" - COLON@13..14 ":" - WHITESPACE@14..15 " " - TUPLE_TYPE@15..17 + COLON@13..14 ":" [] [WHITESPACE(" ")] + TUPLE_TYPE@15..18 L_PAREN@15..16 "(" - R_PAREN@16..17 ")" - WHITESPACE@17..18 " " - EQ@18..19 "=" - WHITESPACE@19..20 " " + R_PAREN@16..17 ")" [] [WHITESPACE(" ")] + EQ@18..19 "=" [] [WHITESPACE(" ")] TUPLE_EXPR@20..22 L_PAREN@20..21 "(" R_PAREN@21..22 ")" - SEMICOLON@22..23 ";" - WHITESPACE@23..24 "\n" + SEMICOLON@22..23 ";" [] [NEWLINE("\n")] + EOF@24..24 "" error 6..9: const globals cannot be mutable diff --git a/crates/syntax/test_data/parser/validation/0224_dangling_dyn.rast b/crates/syntax/test_data/parser/validation/0224_dangling_dyn.rast index b31af5fbc6a5..f98623aeee00 100644 --- a/crates/syntax/test_data/parser/validation/0224_dangling_dyn.rast +++ b/crates/syntax/test_data/parser/validation/0224_dangling_dyn.rast @@ -1,25 +1,23 @@ SOURCE_FILE@0..16 FN@0..16 - FN_KW@0..2 "fn" - WHITESPACE@2..3 " " + FN_KW@0..2 "fn" [] [WHITESPACE(" ")] NAME@3..4 IDENT@3..4 "f" - PARAM_LIST@4..13 + PARAM_LIST@4..14 L_PAREN@4..5 "(" PARAM@5..12 WILDCARD_PAT@5..6 UNDERSCORE@5..6 "_" - COLON@6..7 ":" - WHITESPACE@7..8 " " + COLON@6..7 ":" [] [WHITESPACE(" ")] REF_TYPE@8..12 AMP@8..9 "&" DYN_TRAIT_TYPE@9..12 DYN_KW@9..12 "dyn" TYPE_BOUND_LIST@12..12 - R_PAREN@12..13 ")" - WHITESPACE@13..14 " " + R_PAREN@12..13 ")" [] [WHITESPACE(" ")] BLOCK_EXPR@14..16 STMT_LIST@14..16 L_CURLY@14..15 "{" R_CURLY@15..16 "}" + EOF@16..16 "" error 9..12: At least one trait is required for an object type diff --git a/crates/syntax/test_data/parser/validation/0261_dangling_impl_undeclared_lifetime.rast b/crates/syntax/test_data/parser/validation/0261_dangling_impl_undeclared_lifetime.rast index bd71c61cadae..b1ac2fbd4811 100644 --- a/crates/syntax/test_data/parser/validation/0261_dangling_impl_undeclared_lifetime.rast +++ b/crates/syntax/test_data/parser/validation/0261_dangling_impl_undeclared_lifetime.rast @@ -1,38 +1,33 @@ SOURCE_FILE@0..28 FN@0..28 - FN_KW@0..2 "fn" - WHITESPACE@2..3 " " + FN_KW@0..2 "fn" [] [WHITESPACE(" ")] NAME@3..4 IDENT@3..4 "f" - PARAM_LIST@4..25 + PARAM_LIST@4..26 L_PAREN@4..5 "(" PARAM@5..24 WILDCARD_PAT@5..6 UNDERSCORE@5..6 "_" - COLON@6..7 ":" - WHITESPACE@7..8 " " + COLON@6..7 ":" [] [WHITESPACE(" ")] REF_TYPE@8..24 AMP@8..9 "&" IMPL_TRAIT_TYPE@9..24 - IMPL_KW@9..13 "impl" - WHITESPACE@13..14 " " + IMPL_KW@9..13 "impl" [] [WHITESPACE(" ")] TYPE_BOUND_LIST@14..24 - TYPE_BOUND@14..16 - LIFETIME@14..16 - LIFETIME_IDENT@14..16 "'a" - WHITESPACE@16..17 " " - PLUS@17..18 "+" - WHITESPACE@18..19 " " + TYPE_BOUND@14..17 + LIFETIME@14..17 + LIFETIME_IDENT@14..16 "'a" [] [WHITESPACE(" ")] + PLUS@17..18 "+" [] [WHITESPACE(" ")] TYPE_BOUND@19..24 PATH_TYPE@19..24 PATH@19..24 PATH_SEGMENT@19..24 NAME_REF@19..24 IDENT@19..24 "Sized" - R_PAREN@24..25 ")" - WHITESPACE@25..26 " " + R_PAREN@24..25 ")" [] [WHITESPACE(" ")] BLOCK_EXPR@26..28 STMT_LIST@26..28 L_CURLY@26..27 "{" R_CURLY@27..28 "}" + EOF@28..28 "" error 9..24: ambiguous `+` in a type diff --git a/crates/syntax/test_data/parser/validation/dangling_impl.rast b/crates/syntax/test_data/parser/validation/dangling_impl.rast index c337ee8bbf4c..8dccbf09f531 100644 --- a/crates/syntax/test_data/parser/validation/dangling_impl.rast +++ b/crates/syntax/test_data/parser/validation/dangling_impl.rast @@ -1,23 +1,21 @@ SOURCE_FILE@0..16 FN@0..16 - FN_KW@0..2 "fn" - WHITESPACE@2..3 " " + FN_KW@0..2 "fn" [] [WHITESPACE(" ")] NAME@3..4 IDENT@3..4 "f" - PARAM_LIST@4..13 + PARAM_LIST@4..14 L_PAREN@4..5 "(" PARAM@5..12 WILDCARD_PAT@5..6 UNDERSCORE@5..6 "_" - COLON@6..7 ":" - WHITESPACE@7..8 " " + COLON@6..7 ":" [] [WHITESPACE(" ")] IMPL_TRAIT_TYPE@8..12 IMPL_KW@8..12 "impl" TYPE_BOUND_LIST@12..12 - R_PAREN@12..13 ")" - WHITESPACE@13..14 " " + R_PAREN@12..13 ")" [] [WHITESPACE(" ")] BLOCK_EXPR@14..16 STMT_LIST@14..16 L_CURLY@14..15 "{" R_CURLY@15..16 "}" + EOF@16..16 "" error 8..12: At least one trait is required for an object type diff --git a/crates/syntax/test_data/parser/validation/dangling_impl_reference.rast b/crates/syntax/test_data/parser/validation/dangling_impl_reference.rast index cb73cb4e058b..9679bd42b40c 100644 --- a/crates/syntax/test_data/parser/validation/dangling_impl_reference.rast +++ b/crates/syntax/test_data/parser/validation/dangling_impl_reference.rast @@ -1,25 +1,23 @@ SOURCE_FILE@0..17 FN@0..17 - FN_KW@0..2 "fn" - WHITESPACE@2..3 " " + FN_KW@0..2 "fn" [] [WHITESPACE(" ")] NAME@3..4 IDENT@3..4 "f" - PARAM_LIST@4..14 + PARAM_LIST@4..15 L_PAREN@4..5 "(" PARAM@5..13 WILDCARD_PAT@5..6 UNDERSCORE@5..6 "_" - COLON@6..7 ":" - WHITESPACE@7..8 " " + COLON@6..7 ":" [] [WHITESPACE(" ")] REF_TYPE@8..13 AMP@8..9 "&" IMPL_TRAIT_TYPE@9..13 IMPL_KW@9..13 "impl" TYPE_BOUND_LIST@13..13 - R_PAREN@13..14 ")" - WHITESPACE@14..15 " " + R_PAREN@13..14 ")" [] [WHITESPACE(" ")] BLOCK_EXPR@15..17 STMT_LIST@15..17 L_CURLY@15..16 "{" R_CURLY@16..17 "}" + EOF@17..17 "" error 9..13: At least one trait is required for an object type diff --git a/crates/syntax/test_data/parser/validation/impl_trait_lifetime_only.rast b/crates/syntax/test_data/parser/validation/impl_trait_lifetime_only.rast index ed938d63db44..f9f3cebfb6d0 100644 --- a/crates/syntax/test_data/parser/validation/impl_trait_lifetime_only.rast +++ b/crates/syntax/test_data/parser/validation/impl_trait_lifetime_only.rast @@ -1,29 +1,26 @@ SOURCE_FILE@0..20 FN@0..20 - FN_KW@0..2 "fn" - WHITESPACE@2..3 " " + FN_KW@0..2 "fn" [] [WHITESPACE(" ")] NAME@3..4 IDENT@3..4 "f" - PARAM_LIST@4..17 + PARAM_LIST@4..18 L_PAREN@4..5 "(" PARAM@5..16 WILDCARD_PAT@5..6 UNDERSCORE@5..6 "_" - COLON@6..7 ":" - WHITESPACE@7..8 " " + COLON@6..7 ":" [] [WHITESPACE(" ")] REF_TYPE@8..16 AMP@8..9 "&" IMPL_TRAIT_TYPE@9..16 - IMPL_KW@9..13 "impl" - WHITESPACE@13..14 " " + IMPL_KW@9..13 "impl" [] [WHITESPACE(" ")] TYPE_BOUND_LIST@14..16 TYPE_BOUND@14..16 LIFETIME@14..16 LIFETIME_IDENT@14..16 "'a" - R_PAREN@16..17 ")" - WHITESPACE@17..18 " " + R_PAREN@16..17 ")" [] [WHITESPACE(" ")] BLOCK_EXPR@18..20 STMT_LIST@18..20 L_CURLY@18..19 "{" R_CURLY@19..20 "}" + EOF@20..20 "" error 9..16: At least one trait is required for an object type diff --git a/crates/syntax/test_data/parser/validation/invalid_let_expr.rast b/crates/syntax/test_data/parser/validation/invalid_let_expr.rast index 9e1e4886401a..4ae1f3e56049 100644 --- a/crates/syntax/test_data/parser/validation/invalid_let_expr.rast +++ b/crates/syntax/test_data/parser/validation/invalid_let_expr.rast @@ -1,216 +1,157 @@ SOURCE_FILE@0..282 - FN@0..281 - FN_KW@0..2 "fn" - WHITESPACE@2..3 " " + FN@0..282 + FN_KW@0..2 "fn" [] [WHITESPACE(" ")] NAME@3..6 IDENT@3..6 "foo" - PARAM_LIST@6..8 + PARAM_LIST@6..9 L_PAREN@6..7 "(" - R_PAREN@7..8 ")" - WHITESPACE@8..9 " " - BLOCK_EXPR@9..281 - STMT_LIST@9..281 - L_CURLY@9..10 "{" - WHITESPACE@10..15 "\n " - CONST@15..42 - CONST_KW@15..20 "const" - WHITESPACE@20..21 " " + R_PAREN@7..8 ")" [] [WHITESPACE(" ")] + BLOCK_EXPR@9..282 + STMT_LIST@9..282 + L_CURLY@9..10 "{" [] [NEWLINE("\n")] + CONST@11..43 + CONST_KW@15..20 "const" [WHITESPACE(" ")] [WHITESPACE(" ")] UNDERSCORE@21..22 "_" - COLON@22..23 ":" - WHITESPACE@23..24 " " - TUPLE_TYPE@24..26 + COLON@22..23 ":" [] [WHITESPACE(" ")] + TUPLE_TYPE@24..27 L_PAREN@24..25 "(" - R_PAREN@25..26 ")" - WHITESPACE@26..27 " " - EQ@27..28 "=" - WHITESPACE@28..29 " " + R_PAREN@25..26 ")" [] [WHITESPACE(" ")] + EQ@27..28 "=" [] [WHITESPACE(" ")] LET_EXPR@29..41 - LET_KW@29..32 "let" - WHITESPACE@32..33 " " - WILDCARD_PAT@33..34 - UNDERSCORE@33..34 "_" - WHITESPACE@34..35 " " - EQ@35..36 "=" - WHITESPACE@36..37 " " + LET_KW@29..32 "let" [] [WHITESPACE(" ")] + WILDCARD_PAT@33..35 + UNDERSCORE@33..34 "_" [] [WHITESPACE(" ")] + EQ@35..36 "=" [] [WHITESPACE(" ")] PATH_EXPR@37..41 PATH@37..41 PATH_SEGMENT@37..41 NAME_REF@37..41 IDENT@37..41 "None" - SEMICOLON@41..42 ";" - WHITESPACE@42..48 "\n\n " - LET_STMT@48..83 - LET_KW@48..51 "let" - WHITESPACE@51..52 " " - WILDCARD_PAT@52..53 - UNDERSCORE@52..53 "_" - WHITESPACE@53..54 " " - EQ@54..55 "=" - WHITESPACE@55..56 " " + SEMICOLON@41..42 ";" [] [NEWLINE("\n")] + LET_STMT@43..84 + LET_KW@48..51 "let" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] + WILDCARD_PAT@52..54 + UNDERSCORE@52..53 "_" [] [WHITESPACE(" ")] + EQ@54..55 "=" [] [WHITESPACE(" ")] IF_EXPR@56..82 - IF_KW@56..58 "if" - WHITESPACE@58..59 " " - LITERAL@59..63 - TRUE_KW@59..63 "true" - WHITESPACE@63..64 " " + IF_KW@56..58 "if" [] [WHITESPACE(" ")] + LITERAL@59..64 + TRUE_KW@59..63 "true" [] [WHITESPACE(" ")] BLOCK_EXPR@64..82 STMT_LIST@64..82 - L_CURLY@64..65 "{" - WHITESPACE@65..66 " " - PAREN_EXPR@66..80 + L_CURLY@64..65 "{" [] [WHITESPACE(" ")] + PAREN_EXPR@66..81 L_PAREN@66..67 "(" LET_EXPR@67..79 - LET_KW@67..70 "let" - WHITESPACE@70..71 " " - WILDCARD_PAT@71..72 - UNDERSCORE@71..72 "_" - WHITESPACE@72..73 " " - EQ@73..74 "=" - WHITESPACE@74..75 " " + LET_KW@67..70 "let" [] [WHITESPACE(" ")] + WILDCARD_PAT@71..73 + UNDERSCORE@71..72 "_" [] [WHITESPACE(" ")] + EQ@73..74 "=" [] [WHITESPACE(" ")] PATH_EXPR@75..79 PATH@75..79 PATH_SEGMENT@75..79 NAME_REF@75..79 IDENT@75..79 "None" - R_PAREN@79..80 ")" - WHITESPACE@80..81 " " + R_PAREN@79..80 ")" [] [WHITESPACE(" ")] R_CURLY@81..82 "}" - SEMICOLON@82..83 ";" - WHITESPACE@83..89 "\n\n " - IF_EXPR@89..279 - IF_KW@89..91 "if" - WHITESPACE@91..92 " " - BIN_EXPR@92..114 - LITERAL@92..96 - TRUE_KW@92..96 "true" - WHITESPACE@96..97 " " - AMP2@97..99 "&&" - WHITESPACE@99..100 " " - PAREN_EXPR@100..114 + SEMICOLON@82..83 ";" [] [NEWLINE("\n")] + IF_EXPR@84..280 + IF_KW@89..91 "if" [NEWLINE("\n"), WHITESPACE(" ")] [WHITESPACE(" ")] + BIN_EXPR@92..115 + LITERAL@92..97 + TRUE_KW@92..96 "true" [] [WHITESPACE(" ")] + AMP2@97..99 "&&" [] [WHITESPACE(" ")] + PAREN_EXPR@100..115 L_PAREN@100..101 "(" LET_EXPR@101..113 - LET_KW@101..104 "let" - WHITESPACE@104..105 " " - WILDCARD_PAT@105..106 - UNDERSCORE@105..106 "_" - WHITESPACE@106..107 " " - EQ@107..108 "=" - WHITESPACE@108..109 " " + LET_KW@101..104 "let" [] [WHITESPACE(" ")] + WILDCARD_PAT@105..107 + UNDERSCORE@105..106 "_" [] [WHITESPACE(" ")] + EQ@107..108 "=" [] [WHITESPACE(" ")] PATH_EXPR@109..113 PATH@109..113 PATH_SEGMENT@109..113 NAME_REF@109..113 IDENT@109..113 "None" - R_PAREN@113..114 ")" - WHITESPACE@114..115 " " - BLOCK_EXPR@115..279 - STMT_LIST@115..279 - L_CURLY@115..116 "{" - WHITESPACE@116..125 "\n " - EXPR_STMT@125..140 - PAREN_EXPR@125..139 - L_PAREN@125..126 "(" + R_PAREN@113..114 ")" [] [WHITESPACE(" ")] + BLOCK_EXPR@115..280 + STMT_LIST@115..280 + L_CURLY@115..116 "{" [] [NEWLINE("\n")] + EXPR_STMT@117..141 + PAREN_EXPR@117..139 + L_PAREN@125..126 "(" [WHITESPACE(" ")] [] LET_EXPR@126..138 - LET_KW@126..129 "let" - WHITESPACE@129..130 " " - WILDCARD_PAT@130..131 - UNDERSCORE@130..131 "_" - WHITESPACE@131..132 " " - EQ@132..133 "=" - WHITESPACE@133..134 " " + LET_KW@126..129 "let" [] [WHITESPACE(" ")] + WILDCARD_PAT@130..132 + UNDERSCORE@130..131 "_" [] [WHITESPACE(" ")] + EQ@132..133 "=" [] [WHITESPACE(" ")] PATH_EXPR@134..138 PATH@134..138 PATH_SEGMENT@134..138 NAME_REF@134..138 IDENT@134..138 "None" R_PAREN@138..139 ")" - SEMICOLON@139..140 ";" - WHITESPACE@140..149 "\n " - WHILE_EXPR@149..273 - WHILE_KW@149..154 "while" - WHITESPACE@154..155 " " - LET_EXPR@155..167 - LET_KW@155..158 "let" - WHITESPACE@158..159 " " - WILDCARD_PAT@159..160 - UNDERSCORE@159..160 "_" - WHITESPACE@160..161 " " - EQ@161..162 "=" - WHITESPACE@162..163 " " - PATH_EXPR@163..167 - PATH@163..167 - PATH_SEGMENT@163..167 - NAME_REF@163..167 - IDENT@163..167 "None" - WHITESPACE@167..168 " " - BLOCK_EXPR@168..273 - STMT_LIST@168..273 - L_CURLY@168..169 "{" - WHITESPACE@169..182 "\n " - MATCH_EXPR@182..263 - MATCH_KW@182..187 "match" - WHITESPACE@187..188 " " - PATH_EXPR@188..192 - PATH@188..192 - PATH_SEGMENT@188..192 - NAME_REF@188..192 - IDENT@188..192 "None" - WHITESPACE@192..193 " " - MATCH_ARM_LIST@193..263 - L_CURLY@193..194 "{" - WHITESPACE@194..211 "\n " - MATCH_ARM@211..249 - WILDCARD_PAT@211..212 - UNDERSCORE@211..212 "_" - WHITESPACE@212..213 " " - MATCH_GUARD@213..228 - IF_KW@213..215 "if" - WHITESPACE@215..216 " " - LET_EXPR@216..228 - LET_KW@216..219 "let" - WHITESPACE@219..220 " " - WILDCARD_PAT@220..221 - UNDERSCORE@220..221 "_" - WHITESPACE@221..222 " " - EQ@222..223 "=" - WHITESPACE@223..224 " " - PATH_EXPR@224..228 - PATH@224..228 - PATH_SEGMENT@224..228 - NAME_REF@224..228 - IDENT@224..228 "None" - WHITESPACE@228..229 " " - FAT_ARROW@229..231 "=>" - WHITESPACE@231..232 " " - BLOCK_EXPR@232..249 - STMT_LIST@232..249 - L_CURLY@232..233 "{" - WHITESPACE@233..234 " " - LET_STMT@234..247 - LET_KW@234..237 "let" - WHITESPACE@237..238 " " - WILDCARD_PAT@238..239 - UNDERSCORE@238..239 "_" - WHITESPACE@239..240 " " - EQ@240..241 "=" - WHITESPACE@241..242 " " + SEMICOLON@139..140 ";" [] [NEWLINE("\n")] + WHILE_EXPR@141..274 + WHILE_KW@149..154 "while" [WHITESPACE(" ")] [WHITESPACE(" ")] + LET_EXPR@155..168 + LET_KW@155..158 "let" [] [WHITESPACE(" ")] + WILDCARD_PAT@159..161 + UNDERSCORE@159..160 "_" [] [WHITESPACE(" ")] + EQ@161..162 "=" [] [WHITESPACE(" ")] + PATH_EXPR@163..168 + PATH@163..168 + PATH_SEGMENT@163..168 + NAME_REF@163..168 + IDENT@163..167 "None" [] [WHITESPACE(" ")] + BLOCK_EXPR@168..274 + STMT_LIST@168..274 + L_CURLY@168..169 "{" [] [NEWLINE("\n")] + MATCH_EXPR@170..264 + MATCH_KW@182..187 "match" [WHITESPACE(" ")] [WHITESPACE(" ")] + PATH_EXPR@188..193 + PATH@188..193 + PATH_SEGMENT@188..193 + NAME_REF@188..193 + IDENT@188..192 "None" [] [WHITESPACE(" ")] + MATCH_ARM_LIST@193..264 + L_CURLY@193..194 "{" [] [NEWLINE("\n")] + MATCH_ARM@195..250 + WILDCARD_PAT@195..213 + UNDERSCORE@211..212 "_" [WHITESPACE(" ")] [WHITESPACE(" ")] + MATCH_GUARD@213..229 + IF_KW@213..215 "if" [] [WHITESPACE(" ")] + LET_EXPR@216..229 + LET_KW@216..219 "let" [] [WHITESPACE(" ")] + WILDCARD_PAT@220..222 + UNDERSCORE@220..221 "_" [] [WHITESPACE(" ")] + EQ@222..223 "=" [] [WHITESPACE(" ")] + PATH_EXPR@224..229 + PATH@224..229 + PATH_SEGMENT@224..229 + NAME_REF@224..229 + IDENT@224..228 "None" [] [WHITESPACE(" ")] + FAT_ARROW@229..231 "=>" [] [WHITESPACE(" ")] + BLOCK_EXPR@232..250 + STMT_LIST@232..250 + L_CURLY@232..233 "{" [] [WHITESPACE(" ")] + LET_STMT@234..248 + LET_KW@234..237 "let" [] [WHITESPACE(" ")] + WILDCARD_PAT@238..240 + UNDERSCORE@238..239 "_" [] [WHITESPACE(" ")] + EQ@240..241 "=" [] [WHITESPACE(" ")] PATH_EXPR@242..246 PATH@242..246 PATH_SEGMENT@242..246 NAME_REF@242..246 IDENT@242..246 "None" - SEMICOLON@246..247 ";" - WHITESPACE@247..248 " " - R_CURLY@248..249 "}" - WHITESPACE@249..262 "\n " - R_CURLY@262..263 "}" - WHITESPACE@263..272 "\n " - R_CURLY@272..273 "}" - WHITESPACE@273..278 "\n " - R_CURLY@278..279 "}" - WHITESPACE@279..280 "\n" - R_CURLY@280..281 "}" - WHITESPACE@281..282 "\n" + SEMICOLON@246..247 ";" [] [WHITESPACE(" ")] + R_CURLY@248..249 "}" [] [NEWLINE("\n")] + R_CURLY@262..263 "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY@272..273 "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY@278..279 "}" [WHITESPACE(" ")] [NEWLINE("\n")] + R_CURLY@280..281 "}" [] [NEWLINE("\n")] + EOF@282..282 "" error 29..41: `let` expressions are not supported here error 67..79: `let` expressions are not supported here error 126..138: `let` expressions are not supported here diff --git a/xtask/src/codegen/grammar.rs b/xtask/src/codegen/grammar.rs index 0aad1e299726..f2eb1e8eeedd 100644 --- a/xtask/src/codegen/grammar.rs +++ b/xtask/src/codegen/grammar.rs @@ -398,7 +398,7 @@ fn generate_nodes(kinds: KindsSrc, grammar: &AstSrc) -> String { quote! { impl std::fmt::Display for #name { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) + std::fmt::Display::fmt(&self.syntax().text_without_outer_trivia(), f) } } }