From c8b4c36f8161d34c8145a49965efee4514275989 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 10 Apr 2020 10:11:05 +0200 Subject: [PATCH] Semicolon token --- .../src/handlers/introduce_variable.rs | 2 +- crates/ra_hir_def/src/nameres/raw.rs | 2 +- crates/ra_ide/src/typing.rs | 2 +- crates/ra_syntax/src/ast/edit.rs | 4 +- crates/ra_syntax/src/ast/generated/nodes.rs | 44 ++++++++++++++----- xtask/src/ast_src.rs | 22 +++++----- xtask/src/codegen/gen_syntax.rs | 10 ++++- 7 files changed, 57 insertions(+), 29 deletions(-) diff --git a/crates/ra_assists/src/handlers/introduce_variable.rs b/crates/ra_assists/src/handlers/introduce_variable.rs index ab6bdf6bbdf..8d0f7e922a1 100644 --- a/crates/ra_assists/src/handlers/introduce_variable.rs +++ b/crates/ra_assists/src/handlers/introduce_variable.rs @@ -61,7 +61,7 @@ pub(crate) fn introduce_variable(ctx: AssistCtx) -> Option { }; if is_full_stmt { tested_by!(test_introduce_var_expr_stmt); - if full_stmt.unwrap().semi_token().is_none() { + if full_stmt.unwrap().semicolon_token().is_none() { buf.push_str(";"); } edit.replace(expr.syntax().text_range(), buf); diff --git a/crates/ra_hir_def/src/nameres/raw.rs b/crates/ra_hir_def/src/nameres/raw.rs index e72ba52cfb3..afd538e4acb 100644 --- a/crates/ra_hir_def/src/nameres/raw.rs +++ b/crates/ra_hir_def/src/nameres/raw.rs @@ -287,7 +287,7 @@ fn add_module(&mut self, current_module: Option>, module: ast::M let visibility = RawVisibility::from_ast_with_hygiene(module.visibility(), &self.hygiene); let ast_id = self.source_ast_id_map.ast_id(&module); - if module.semi_token().is_some() { + if module.semicolon_token().is_some() { let item = self.raw_items.modules.alloc(ModuleData::Declaration { name, visibility, ast_id }); self.push_item(current_module, attrs, RawItemKind::Module(item)); diff --git a/crates/ra_ide/src/typing.rs b/crates/ra_ide/src/typing.rs index 71d2bcb045d..f55cd3bf534 100644 --- a/crates/ra_ide/src/typing.rs +++ b/crates/ra_ide/src/typing.rs @@ -63,7 +63,7 @@ fn on_char_typed_inner( fn on_eq_typed(file: &SourceFile, offset: TextUnit) -> Option { assert_eq!(file.syntax().text().char_at(offset), Some('=')); let let_stmt: ast::LetStmt = find_node_at_offset(file.syntax(), offset)?; - if let_stmt.semi_token().is_some() { + if let_stmt.semicolon_token().is_some() { return None; } if let Some(expr) = let_stmt.initializer() { diff --git a/crates/ra_syntax/src/ast/edit.rs b/crates/ra_syntax/src/ast/edit.rs index 3d428fab3a3..a01f6487d60 100644 --- a/crates/ra_syntax/src/ast/edit.rs +++ b/crates/ra_syntax/src/ast/edit.rs @@ -32,9 +32,9 @@ pub fn with_body(&self, body: ast::Block) -> ast::FnDef { let mut to_insert: ArrayVec<[SyntaxElement; 2]> = ArrayVec::new(); let old_body_or_semi: SyntaxElement = if let Some(old_body) = self.body() { old_body.syntax().clone().into() - } else if let Some(semi) = self.semi_token() { + } else if let Some(semi) = self.semicolon_token() { to_insert.push(make::tokens::single_space().into()); - semi.syntax.clone().into() + semi.into() } else { to_insert.push(make::tokens::single_space().into()); to_insert.push(body.syntax().clone().into()); diff --git a/crates/ra_syntax/src/ast/generated/nodes.rs b/crates/ra_syntax/src/ast/generated/nodes.rs index 3b014e312df..214e1291876 100644 --- a/crates/ra_syntax/src/ast/generated/nodes.rs +++ b/crates/ra_syntax/src/ast/generated/nodes.rs @@ -58,7 +58,9 @@ pub fn fn_token(&self) -> Option { support::token2(&self.syntax, T! pub fn param_list(&self) -> Option { support::child(&self.syntax) } pub fn ret_type(&self) -> Option { support::child(&self.syntax) } pub fn body(&self) -> Option { support::child(&self.syntax) } - pub fn semi_token(&self) -> Option { support::token(&self.syntax) } + pub fn semicolon_token(&self) -> Option { + support::token2(&self.syntax, T ! [ ; ]) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct RetType { @@ -102,7 +104,9 @@ impl ast::DocCommentsOwner for StructDef {} impl StructDef { pub fn struct_token(&self) -> Option { support::token2(&self.syntax, T![struct]) } pub fn field_def_list(&self) -> Option { support::child(&self.syntax) } - pub fn semi_token(&self) -> Option { support::token(&self.syntax) } + pub fn semicolon_token(&self) -> Option { + support::token2(&self.syntax, T ! [ ; ]) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct UnionDef { @@ -328,7 +332,9 @@ impl ast::DocCommentsOwner for Module {} impl Module { pub fn mod_token(&self) -> Option { support::token2(&self.syntax, T![mod]) } pub fn item_list(&self) -> Option { support::child(&self.syntax) } - pub fn semi_token(&self) -> Option { support::token(&self.syntax) } + pub fn semicolon_token(&self) -> Option { + support::token2(&self.syntax, T ! [ ; ]) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ItemList { @@ -379,7 +385,9 @@ pub fn default_token(&self) -> Option { pub fn const_token(&self) -> Option { support::token2(&self.syntax, T![const]) } pub fn eq_token(&self) -> Option { support::token(&self.syntax) } pub fn body(&self) -> Option { support::child(&self.syntax) } - pub fn semi_token(&self) -> Option { support::token(&self.syntax) } + pub fn semicolon_token(&self) -> Option { + support::token2(&self.syntax, T ! [ ; ]) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct StaticDef { @@ -407,7 +415,9 @@ pub fn static_token(&self) -> Option { support::token2(&self.syntax pub fn mut_token(&self) -> Option { support::token2(&self.syntax, T![mut]) } pub fn eq_token(&self) -> Option { support::token(&self.syntax) } pub fn body(&self) -> Option { support::child(&self.syntax) } - pub fn semi_token(&self) -> Option { support::token(&self.syntax) } + pub fn semicolon_token(&self) -> Option { + support::token2(&self.syntax, T ! [ ; ]) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct TypeAliasDef { @@ -437,7 +447,9 @@ pub fn default_token(&self) -> Option { pub fn type_token(&self) -> Option { support::token2(&self.syntax, T![type]) } pub fn eq_token(&self) -> Option { support::token(&self.syntax) } pub fn type_ref(&self) -> Option { support::child(&self.syntax) } - pub fn semi_token(&self) -> Option { support::token(&self.syntax) } + pub fn semicolon_token(&self) -> Option { + support::token2(&self.syntax, T ! [ ; ]) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ImplDef { @@ -582,7 +594,9 @@ fn syntax(&self) -> &SyntaxNode { &self.syntax } impl ArrayType { pub fn l_brack_token(&self) -> Option { support::token(&self.syntax) } pub fn type_ref(&self) -> Option { support::child(&self.syntax) } - pub fn semi_token(&self) -> Option { support::token(&self.syntax) } + pub fn semicolon_token(&self) -> Option { + support::token2(&self.syntax, T ! [ ; ]) + } pub fn expr(&self) -> Option { support::child(&self.syntax) } pub fn r_brack_token(&self) -> Option { support::token(&self.syntax) } } @@ -765,7 +779,9 @@ impl ast::AttrsOwner for ArrayExpr {} impl ArrayExpr { pub fn l_brack_token(&self) -> Option { support::token(&self.syntax) } pub fn exprs(&self) -> AstChildren { support::children(&self.syntax) } - pub fn semi_token(&self) -> Option { support::token(&self.syntax) } + pub fn semicolon_token(&self) -> Option { + support::token2(&self.syntax, T ! [ ; ]) + } pub fn r_brack_token(&self) -> Option { support::token(&self.syntax) } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -1859,7 +1875,9 @@ impl MacroCall { pub fn path(&self) -> Option { support::child(&self.syntax) } pub fn excl_token(&self) -> Option { support::token(&self.syntax) } pub fn token_tree(&self) -> Option { support::child(&self.syntax) } - pub fn semi_token(&self) -> Option { support::token(&self.syntax) } + pub fn semicolon_token(&self) -> Option { + support::token2(&self.syntax, T ! [ ; ]) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Attr { @@ -2100,7 +2118,9 @@ fn syntax(&self) -> &SyntaxNode { &self.syntax } impl ast::AttrsOwner for ExprStmt {} impl ExprStmt { pub fn expr(&self) -> Option { support::child(&self.syntax) } - pub fn semi_token(&self) -> Option { support::token(&self.syntax) } + pub fn semicolon_token(&self) -> Option { + support::token2(&self.syntax, T ! [ ; ]) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct LetStmt { @@ -2124,7 +2144,9 @@ pub fn let_token(&self) -> Option { support::token2(&self.syntax, T pub fn pat(&self) -> Option { support::child(&self.syntax) } pub fn eq_token(&self) -> Option { support::token(&self.syntax) } pub fn initializer(&self) -> Option { support::child(&self.syntax) } - pub fn semi_token(&self) -> Option { support::token(&self.syntax) } + pub fn semicolon_token(&self) -> Option { + support::token2(&self.syntax, T ! [ ; ]) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Condition { diff --git a/xtask/src/ast_src.rs b/xtask/src/ast_src.rs index 3da2805517d..1a6ee935f2d 100644 --- a/xtask/src/ast_src.rs +++ b/xtask/src/ast_src.rs @@ -319,7 +319,7 @@ struct FnDef: VisibilityOwner, NameOwner, TypeParamsOwner, DocCommentsOwner, Att ParamList, RetType, body: BlockExpr, - Semi + T![;] } struct RetType { ThinArrow, TypeRef } @@ -327,7 +327,7 @@ struct RetType { ThinArrow, TypeRef } struct StructDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCommentsOwner { T![struct], FieldDefList, - Semi + T![;] } struct UnionDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCommentsOwner { @@ -368,7 +368,7 @@ struct TraitDef: VisibilityOwner, NameOwner, AttrsOwner, DocCommentsOwner, TypeP struct Module: VisibilityOwner, NameOwner, AttrsOwner, DocCommentsOwner { T![mod], ItemList, - Semi + T![;] } struct ItemList: ModuleItemOwner { @@ -382,7 +382,7 @@ struct ConstDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCom T![const], Eq, body: Expr, - Semi + T![;] } struct StaticDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCommentsOwner, TypeAscriptionOwner { @@ -390,7 +390,7 @@ struct StaticDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCo T![mut], Eq, body: Expr, - Semi + T![;] } struct TypeAliasDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCommentsOwner, TypeBoundsOwner { @@ -398,7 +398,7 @@ struct TypeAliasDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, Do T![type], Eq, TypeRef, - Semi + T![;] } struct ImplDef: TypeParamsOwner, AttrsOwner { @@ -416,7 +416,7 @@ struct TupleType { LParen, fields: [TypeRef], RParen } struct NeverType { Excl } struct PathType { Path } struct PointerType { Star, T![const], T![mut], TypeRef } - struct ArrayType { LBrack, TypeRef, Semi, Expr, RBrack } + struct ArrayType { LBrack, TypeRef, T![;], Expr, RBrack } struct SliceType { LBrack, TypeRef, RBrack } struct ReferenceType { Amp, Lifetime, T![mut], TypeRef } struct PlaceholderType { Underscore } @@ -426,7 +426,7 @@ struct ImplTraitType: TypeBoundsOwner { T![impl] } struct DynTraitType: TypeBoundsOwner { T![dyn] } struct TupleExpr: AttrsOwner { LParen, exprs: [Expr], RParen } - struct ArrayExpr: AttrsOwner { LBrack, exprs: [Expr], Semi, RBrack } + struct ArrayExpr: AttrsOwner { LBrack, exprs: [Expr], T![;], RBrack } struct ParenExpr: AttrsOwner { LParen, Expr, RParen } struct PathExpr { Path } struct LambdaExpr: AttrsOwner { @@ -520,7 +520,7 @@ struct Name { Ident } struct NameRef { NameRefToken } struct MacroCall: NameOwner, AttrsOwner,DocCommentsOwner { - Path, Excl, TokenTree, Semi + Path, Excl, TokenTree, T![;] } struct Attr { Pound, Excl, LBrack, Path, Eq, input: AttrInput, RBrack } struct TokenTree {} @@ -546,13 +546,13 @@ struct TypeBoundList { bounds: [TypeBound] } struct WherePred: TypeBoundsOwner { Lifetime, TypeRef } struct WhereClause { T![where], predicates: [WherePred] } struct Abi { String } - struct ExprStmt: AttrsOwner { Expr, Semi } + struct ExprStmt: AttrsOwner { Expr, T![;] } struct LetStmt: AttrsOwner, TypeAscriptionOwner { T![let], Pat, Eq, initializer: Expr, - Semi, + T![;], } struct Condition { T![let], Pat, Eq, Expr } struct Block: AttrsOwner, ModuleItemOwner { diff --git a/xtask/src/codegen/gen_syntax.rs b/xtask/src/codegen/gen_syntax.rs index c4fb29bbfa6..26f541da100 100644 --- a/xtask/src/codegen/gen_syntax.rs +++ b/xtask/src/codegen/gen_syntax.rs @@ -515,7 +515,7 @@ fn is_many(&self) -> bool { fn token_kind(&self) -> Option { let res = match self { Field::Token(token) => { - let token = format_ident!("{}", token); + let token: proc_macro2::TokenStream = token.parse().unwrap(); quote! { T![#token] } } _ => return None, @@ -524,7 +524,13 @@ fn token_kind(&self) -> Option { } fn method_name(&self) -> proc_macro2::Ident { match self { - Field::Token(name) => format_ident!("{}_token", name), + Field::Token(name) => { + let name = match *name { + ";" => "semicolon", + _ => name, + }; + format_ident!("{}_token", name) + } Field::Node { name, src } => match src { FieldSrc::Shorthand => format_ident!("{}", to_lower_snake_case(name)), _ => format_ident!("{}", name),