From fa6e0b0d38d2a030b959be91232927b9c096272b Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 8 Jan 2019 12:23:10 +0300 Subject: itroduce trait for ast tokens --- crates/ra_analysis/src/imp.rs | 2 +- crates/ra_analysis/src/symbol_index.rs | 2 +- crates/ra_editor/src/assists/add_impl.rs | 2 +- crates/ra_hir/src/name.rs | 4 +- crates/ra_hir/src/source_binder.rs | 2 +- crates/ra_syntax/src/ast.rs | 52 +++++--------------------- crates/ra_syntax/src/ast/generated.rs | 7 ++++ crates/ra_syntax/src/grammar.ron | 14 +++---- crates/ra_syntax/src/validation/byte.rs | 2 +- crates/ra_syntax/src/validation/byte_string.rs | 2 +- crates/ra_syntax/src/validation/char.rs | 2 +- crates/ra_syntax/src/validation/string.rs | 2 +- 12 files changed, 34 insertions(+), 59 deletions(-) diff --git a/crates/ra_analysis/src/imp.rs b/crates/ra_analysis/src/imp.rs index 8ac430e41..98554dd4c 100644 --- a/crates/ra_analysis/src/imp.rs +++ b/crates/ra_analysis/src/imp.rs @@ -115,7 +115,7 @@ impl db::RootDatabase { let name = ast_module.name().unwrap(); Ok(vec![NavigationTarget { file_id, - name: name.text(), + name: name.text().clone(), range: name.syntax().range(), kind: MODULE, ptr: None, diff --git a/crates/ra_analysis/src/symbol_index.rs b/crates/ra_analysis/src/symbol_index.rs index ed1796756..8dd15b40e 100644 --- a/crates/ra_analysis/src/symbol_index.rs +++ b/crates/ra_analysis/src/symbol_index.rs @@ -205,7 +205,7 @@ pub(crate) struct FileSymbol { fn to_symbol(node: &SyntaxNode) -> Option<(SmolStr, LocalSyntaxPtr)> { fn decl(node: &N) -> Option<(SmolStr, LocalSyntaxPtr)> { - let name = node.name()?.text(); + let name = node.name()?.text().clone(); let ptr = LocalSyntaxPtr::new(node.syntax()); Some((name, ptr)) } diff --git a/crates/ra_editor/src/assists/add_impl.rs b/crates/ra_editor/src/assists/add_impl.rs index 9353e2717..2eda7cae2 100644 --- a/crates/ra_editor/src/assists/add_impl.rs +++ b/crates/ra_editor/src/assists/add_impl.rs @@ -1,6 +1,6 @@ use join_to_string::join; use ra_syntax::{ - ast::{self, AstNode, NameOwner, TypeParamsOwner}, + ast::{self, AstNode, AstToken, NameOwner, TypeParamsOwner}, TextUnit, }; diff --git a/crates/ra_hir/src/name.rs b/crates/ra_hir/src/name.rs index dee1c9c5c..3e6ce8b95 100644 --- a/crates/ra_hir/src/name.rs +++ b/crates/ra_hir/src/name.rs @@ -76,13 +76,13 @@ pub(crate) trait AsName { impl AsName for ast::NameRef { fn as_name(&self) -> Name { - Name::new(self.text()) + Name::new(self.text().clone()) } } impl AsName for ast::Name { fn as_name(&self) -> Name { - Name::new(self.text()) + Name::new(self.text().clone()) } } diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 82675c0e4..59a803761 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -177,7 +177,7 @@ pub fn macro_symbols( if let Some(name) = trait_def.name() { let dst_range = name.syntax().range(); if let Some(src_range) = exp.map_range_back(dst_range) { - res.push((name.text(), src_range + off)) + res.push((name.text().clone(), src_range + off)) } } } diff --git a/crates/ra_syntax/src/ast.rs b/crates/ra_syntax/src/ast.rs index 0e303ee98..96879ae5a 100644 --- a/crates/ra_syntax/src/ast.rs +++ b/crates/ra_syntax/src/ast.rs @@ -23,6 +23,12 @@ pub trait AstNode: rowan::TransparentNewType> fn to_owned(&self) -> TreePtr; } +pub trait AstToken: AstNode { + fn text(&self) -> &SmolStr { + self.syntax().leaf_text().unwrap() + } +} + pub trait NameOwner: AstNode { fn name(&self) -> Option<&Name> { child_opt(self) @@ -155,41 +161,7 @@ impl Attr { } } -impl Lifetime { - pub fn text(&self) -> SmolStr { - self.syntax().leaf_text().unwrap().clone() - } -} - -impl Char { - pub fn text(&self) -> &SmolStr { - &self.syntax().leaf_text().unwrap() - } -} - -impl Byte { - pub fn text(&self) -> &SmolStr { - &self.syntax().leaf_text().unwrap() - } -} - -impl ByteString { - pub fn text(&self) -> &SmolStr { - &self.syntax().leaf_text().unwrap() - } -} - -impl String { - pub fn text(&self) -> &SmolStr { - &self.syntax().leaf_text().unwrap() - } -} - impl Comment { - pub fn text(&self) -> &SmolStr { - self.syntax().leaf_text().unwrap() - } - pub fn flavor(&self) -> CommentFlavor { let text = self.text(); if text.starts_with("///") { @@ -248,10 +220,6 @@ impl CommentFlavor { } impl Whitespace { - pub fn text(&self) -> &SmolStr { - &self.syntax().leaf_text().unwrap() - } - pub fn count_newlines_lazy(&self) -> impl Iterator { self.text().chars().filter(|&c| c == '\n').map(|_| &()) } @@ -262,16 +230,16 @@ impl Whitespace { } impl Name { - pub fn text(&self) -> SmolStr { + pub fn text(&self) -> &SmolStr { let ident = self.syntax().first_child().unwrap(); - ident.leaf_text().unwrap().clone() + ident.leaf_text().unwrap() } } impl NameRef { - pub fn text(&self) -> SmolStr { + pub fn text(&self) -> &SmolStr { let ident = self.syntax().first_child().unwrap(); - ident.leaf_text().unwrap().clone() + ident.leaf_text().unwrap() } } diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs index 5e96ab142..547e3c003 100644 --- a/crates/ra_syntax/src/ast/generated.rs +++ b/crates/ra_syntax/src/ast/generated.rs @@ -288,6 +288,7 @@ impl AstNode for Byte { } +impl ast::AstToken for Byte {} impl Byte {} // ByteString @@ -312,6 +313,7 @@ impl AstNode for ByteString { } +impl ast::AstToken for ByteString {} impl ByteString {} // CallExpr @@ -397,6 +399,7 @@ impl AstNode for Char { } +impl ast::AstToken for Char {} impl Char {} // Comment @@ -421,6 +424,7 @@ impl AstNode for Comment { } +impl ast::AstToken for Comment {} impl Comment {} // Condition @@ -1270,6 +1274,7 @@ impl AstNode for Lifetime { } +impl ast::AstToken for Lifetime {} impl Lifetime {} // LifetimeParam @@ -2766,6 +2771,7 @@ impl AstNode for String { } +impl ast::AstToken for String {} impl String {} // StructDef @@ -3391,5 +3397,6 @@ impl AstNode for Whitespace { } +impl ast::AstToken for Whitespace {} impl Whitespace {} diff --git a/crates/ra_syntax/src/grammar.ron b/crates/ra_syntax/src/grammar.ron index d7505ea06..bddd96a5c 100644 --- a/crates/ra_syntax/src/grammar.ron +++ b/crates/ra_syntax/src/grammar.ron @@ -424,10 +424,10 @@ Grammar( "PrefixExpr": (options: ["Expr"]), "RangeExpr": (), "BinExpr": (), - "String": (), - "Byte": (), - "ByteString": (), - "Char": (), + "String": ( traits: ["AstToken"] ), + "Byte": ( traits: ["AstToken"] ), + "ByteString": ( traits: ["AstToken"] ), + "Char": ( traits: ["AstToken"] ), "Literal": (), "Expr": ( @@ -505,7 +505,7 @@ Grammar( ), "TypeParam": ( traits: ["NameOwner"] ), "LifetimeParam": ( options: [ "Lifetime" ] ), - "Lifetime": (), + "Lifetime": ( traits: ["AstToken"] ), "WhereClause": (), "ExprStmt": ( options: [ ["expr", "Expr"] ] @@ -562,7 +562,7 @@ Grammar( "PathSegment": ( options: [ "NameRef" ] ), - "Comment": (), - "Whitespace": (), + "Comment": ( traits: ["AstToken"] ), + "Whitespace": ( traits: ["AstToken"] ), }, ) diff --git a/crates/ra_syntax/src/validation/byte.rs b/crates/ra_syntax/src/validation/byte.rs index 4deb302a7..9ab4b18a3 100644 --- a/crates/ra_syntax/src/validation/byte.rs +++ b/crates/ra_syntax/src/validation/byte.rs @@ -1,7 +1,7 @@ //! Validation of byte literals use crate::{ - ast::{self, AstNode}, + ast::{self, AstNode, AstToken}, string_lexing::{self, StringComponentKind}, TextRange, validation::char, diff --git a/crates/ra_syntax/src/validation/byte_string.rs b/crates/ra_syntax/src/validation/byte_string.rs index 670c43a09..cd41a0a68 100644 --- a/crates/ra_syntax/src/validation/byte_string.rs +++ b/crates/ra_syntax/src/validation/byte_string.rs @@ -1,5 +1,5 @@ use crate::{ - ast::{self, AstNode}, + ast::{self, AstNode, AstToken}, string_lexing::{self, StringComponentKind}, yellow::{ SyntaxError, diff --git a/crates/ra_syntax/src/validation/char.rs b/crates/ra_syntax/src/validation/char.rs index 9cbd43fba..169c88f56 100644 --- a/crates/ra_syntax/src/validation/char.rs +++ b/crates/ra_syntax/src/validation/char.rs @@ -5,7 +5,7 @@ use std::u32; use arrayvec::ArrayString; use crate::{ - ast::{self, AstNode}, + ast::{self, AstNode, AstToken}, string_lexing::{self, StringComponentKind}, TextRange, yellow::{ diff --git a/crates/ra_syntax/src/validation/string.rs b/crates/ra_syntax/src/validation/string.rs index 7b2a68d12..cb86b765f 100644 --- a/crates/ra_syntax/src/validation/string.rs +++ b/crates/ra_syntax/src/validation/string.rs @@ -1,5 +1,5 @@ use crate::{ - ast::{self, AstNode}, + ast::{self, AstNode, AstToken}, string_lexing, yellow::{ SyntaxError, -- cgit v1.2.3