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

@ -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,

View file

@ -205,7 +205,7 @@ pub(crate) struct FileSymbol {
fn to_symbol(node: &SyntaxNode) -> Option<(SmolStr, LocalSyntaxPtr)> {
fn decl<N: NameOwner>(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))
}

View file

@ -1,6 +1,6 @@
use join_to_string::join;
use ra_syntax::{
ast::{self, AstNode, NameOwner, TypeParamsOwner},
ast::{self, AstNode, AstToken, NameOwner, TypeParamsOwner},
TextUnit,
};

View file

@ -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())
}
}

View file

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

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,