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_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 +- 7 files changed, 28 insertions(+), 53 deletions(-) (limited to 'crates/ra_syntax/src') 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