itroduce trait for ast tokens

This commit is contained in:
Aleksey Kladov
2019-01-08 12:23:10 +03:00
parent 3f4be81912
commit fa6e0b0d38
12 changed files with 34 additions and 59 deletions

View File

@@ -23,6 +23,12 @@ pub trait AstNode: rowan::TransparentNewType<Repr = rowan::SyntaxNode<RaTypes>>
fn to_owned(&self) -> TreePtr<Self>;
}
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<Item = &()> {
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()
}
}

View File

@@ -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 {}

View File

@@ -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"] ),
},
)

View File

@@ -1,7 +1,7 @@
//! Validation of byte literals
use crate::{
ast::{self, AstNode},
ast::{self, AstNode, AstToken},
string_lexing::{self, StringComponentKind},
TextRange,
validation::char,

View File

@@ -1,5 +1,5 @@
use crate::{
ast::{self, AstNode},
ast::{self, AstNode, AstToken},
string_lexing::{self, StringComponentKind},
yellow::{
SyntaxError,

View File

@@ -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::{

View File

@@ -1,5 +1,5 @@
use crate::{
ast::{self, AstNode},
ast::{self, AstNode, AstToken},
string_lexing,
yellow::{
SyntaxError,