mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-09 20:06:28 +00:00
organizize
This commit is contained in:
parent
26262aaf05
commit
7c67612b8a
376 changed files with 27 additions and 145 deletions
74
crates/libsyntax2/src/ast/mod.rs
Normal file
74
crates/libsyntax2/src/ast/mod.rs
Normal file
|
@ -0,0 +1,74 @@
|
|||
mod generated;
|
||||
|
||||
use std::sync::Arc;
|
||||
use {
|
||||
SyntaxNode, SyntaxRoot, TreeRoot, SyntaxError,
|
||||
SyntaxKind::*,
|
||||
};
|
||||
pub use self::generated::*;
|
||||
|
||||
pub trait AstNode<R: TreeRoot>: Sized {
|
||||
fn cast(syntax: SyntaxNode<R>) -> Option<Self>;
|
||||
fn syntax(&self) -> &SyntaxNode<R>;
|
||||
}
|
||||
|
||||
impl File<Arc<SyntaxRoot>> {
|
||||
pub fn parse(text: &str) -> Self {
|
||||
File::cast(::parse(text)).unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
impl<R: TreeRoot> File<R> {
|
||||
pub fn errors(&self) -> Vec<SyntaxError> {
|
||||
self.syntax().root.errors.clone()
|
||||
}
|
||||
|
||||
pub fn functions<'a>(&'a self) -> impl Iterator<Item = Function<R>> + 'a {
|
||||
self.syntax()
|
||||
.children()
|
||||
.filter_map(Function::cast)
|
||||
}
|
||||
}
|
||||
|
||||
impl<R: TreeRoot> Function<R> {
|
||||
pub fn name(&self) -> Option<Name<R>> {
|
||||
self.syntax()
|
||||
.children()
|
||||
.filter_map(Name::cast)
|
||||
.next()
|
||||
}
|
||||
|
||||
pub fn has_atom_attr(&self, atom: &str) -> bool {
|
||||
self.syntax()
|
||||
.children()
|
||||
.filter(|node| node.kind() == ATTR)
|
||||
.any(|attr| {
|
||||
let mut metas = attr.children().filter(|node| node.kind() == META_ITEM);
|
||||
let meta = match metas.next() {
|
||||
None => return false,
|
||||
Some(meta) => {
|
||||
if metas.next().is_some() {
|
||||
return false;
|
||||
}
|
||||
meta
|
||||
}
|
||||
};
|
||||
let mut children = meta.children();
|
||||
match children.next() {
|
||||
None => false,
|
||||
Some(child) => {
|
||||
if children.next().is_some() {
|
||||
return false;
|
||||
}
|
||||
child.kind() == IDENT && child.text() == atom
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl<R: TreeRoot> Name<R> {
|
||||
pub fn text(&self) -> String {
|
||||
self.syntax().text()
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue