use ra_db::FileId;
use ra_syntax::{
ast::{self, AstNode},
- AstPtr,
+ match_ast, AstPtr,
SyntaxKind::*,
SyntaxNode, SyntaxNodePtr, TextRange, TextUnit,
};
file_id: FileId,
node: &SyntaxNode,
) -> Option<Resolver> {
- if let Some(module) = ast::Module::cast(node.clone()) {
- let src = crate::Source { file_id: file_id.into(), ast: module };
- Some(crate::Module::from_declaration(db, src)?.resolver(db))
- } else if let Some(file) = ast::SourceFile::cast(node.clone()) {
- let src =
- crate::Source { file_id: file_id.into(), ast: crate::ModuleSource::SourceFile(file) };
- Some(crate::Module::from_definition(db, src)?.resolver(db))
- } else if let Some(s) = ast::StructDef::cast(node.clone()) {
- let src = crate::Source { file_id: file_id.into(), ast: s };
- Some(Struct::from_source(db, src)?.resolver(db))
- } else if let Some(e) = ast::EnumDef::cast(node.clone()) {
- let src = crate::Source { file_id: file_id.into(), ast: e };
- Some(Enum::from_source(db, src)?.resolver(db))
- } else if node.kind() == FN_DEF || node.kind() == CONST_DEF || node.kind() == STATIC_DEF {
- Some(def_with_body_from_child_node(db, file_id, node)?.resolver(db))
- } else {
- // FIXME add missing cases
- None
+ match_ast! {
+ match node {
+ ast::Module(it) => {
+ let src = crate::Source { file_id: file_id.into(), ast: it };
+ Some(crate::Module::from_declaration(db, src)?.resolver(db))
+ },
+ ast::SourceFile(it) => {
+ let src =
+ crate::Source { file_id: file_id.into(), ast: crate::ModuleSource::SourceFile(it) };
+ Some(crate::Module::from_definition(db, src)?.resolver(db))
+ },
+ ast::StructDef(it) => {
+ let src = crate::Source { file_id: file_id.into(), ast: it };
+ Some(Struct::from_source(db, src)?.resolver(db))
+ },
+ ast::EnumDef(it) => {
+ let src = crate::Source { file_id: file_id.into(), ast: it };
+ Some(Enum::from_source(db, src)?.resolver(db))
+ },
+ _ => {
+ if node.kind() == FN_DEF || node.kind() == CONST_DEF || node.kind() == STATIC_DEF {
+ Some(def_with_body_from_child_node(db, file_id, node)?.resolver(db))
+ } else {
+ // FIXME add missing cases
+ None
+ }
+ },
+ }
}
}
let ctx = LocationCtx::new(db, module.id, file_id.into());
node.ancestors().find_map(|node| {
- if let Some(def) = ast::FnDef::cast(node.clone()) {
- return Some(Function { id: ctx.to_def(&def) }.into());
- }
- if let Some(def) = ast::ConstDef::cast(node.clone()) {
- return Some(Const { id: ctx.to_def(&def) }.into());
- }
- if let Some(def) = ast::StaticDef::cast(node) {
- return Some(Static { id: ctx.to_def(&def) }.into());
+ match_ast! {
+ match node {
+ ast::FnDef(def) => { Some(Function {id: ctx.to_def(&def) }.into()) },
+ ast::ConstDef(def) => { Some(Const { id: ctx.to_def(&def) }.into()) },
+ ast::StaticDef(def) => { Some(Static { id: ctx.to_def(&def) }.into()) },
+ _ => { None },
+ }
}
- None
})
}
use ra_db::SourceDatabase;
use ra_syntax::{
ast::{self, AstNode, AttrsOwner, ModuleItemOwner, NameOwner},
- SyntaxNode, TextRange,
+ match_ast, SyntaxNode, TextRange,
};
use crate::{db::RootDatabase, FileId};
}
fn runnable(db: &RootDatabase, file_id: FileId, item: SyntaxNode) -> Option<Runnable> {
- if let Some(fn_def) = ast::FnDef::cast(item.clone()) {
- runnable_fn(fn_def)
- } else if let Some(m) = ast::Module::cast(item) {
- runnable_mod(db, file_id, m)
- } else {
- None
+ match_ast! {
+ match item {
+ ast::FnDef(it) => { runnable_fn(it) },
+ ast::Module(it) => { runnable_mod(db, file_id, it) },
+ _ => { None },
+ }
}
}
use crate::{
ast::{self, child_opt, children, AstChildren, AstNode, AstToken},
+ match_ast,
syntax_node::{SyntaxElementChildren, SyntaxNodeChildren},
};
fn next(&mut self) -> Option<ItemOrMacro> {
loop {
let n = self.0.next()?;
- if let Some(item) = ast::ModuleItem::cast(n.clone()) {
- return Some(ItemOrMacro::Item(item));
- }
- if let Some(call) = ast::MacroCall::cast(n) {
- return Some(ItemOrMacro::Macro(call));
+ match_ast! {
+ match n {
+ ast::ModuleItem(it) => { return Some(ItemOrMacro::Item(it)) },
+ ast::MacroCall(it) => { return Some(ItemOrMacro::Macro(it)) },
+ _ => {},
+ }
}
}
}